You are on page 1of 6

NHÓM 8

DANH SÁCH CÁC THÀNH VIÊN THAM GIA

STT MSSV HỌ VÀ TÊN


37 31201023586 Triệu Thị Minh Thúy
38 31201023603 Phạm Vũ Sơn Trà
39 31201023609 Hồ Thị Quỳnh Trang
40 31201021311 Lê Thị Thu Trang
41 31201023613 Nguyễn Thị Yến Trang
42 31201025436 Võ Thị Mỹ Tuyết

Đề tài 1: Tìm hiểu về khái niệm “Buffer overflows” (tấn công tràn bộ đệm)
bao gồm khái niệm, cách thức diễn ra, thiệt hại và biện pháp phòng ngừa
và phát hiện.

Tấn công Buffer Overflow xảy ra khi người dùng hay hacker cung cấp các biên đầu
vào hay dữ liệu vượt quá khả năng xử lý của chương trình làm cho hệ thống bị treo
dẫn đến từ chối dịch vụ hay có khả năng bị các hacker lợi dụng chèn các chỉ thị trái
phép nhằm thực hiện các đoạn mã nguy hiểm từ xa. Vì vậy, trong bài báo này chúng
ta sẽ tìm hiểu những khái niệm cơ bản nhất về tấn công tràn bộ đệm, các cách tấn
công, cách phát hiện và cách phòng chống để nâng cao kiến thức và kỹ năng phòng
chống lại các cuộc tấn công Buffer Overflow.

1. Khái niệm
Lỗi tràn bộ đệm (Buffer Overflow) là một điều kiện bất thường khi tiến trình lưu
trữ dữ liệu vượt ra ngoài biên của bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu
có thể đè lên các bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm
khác, các biến và dữ liệu điều khiển luồng chảy của cả chương trình.

2.Cách thức diễn ra


Những kẻ tấn công khai thác các vấn đề tràn bộ đệm bằng cách ghi đè lên bộ nhớ
của một ứng dụng. Điều này thay đổi đường dẫn thực thi của chương trình, kích hoạt
phản hồi làm hỏng tệp hoặc tiết lộ thông tin cá nhân. Ví dụ, kẻ tấn công có thể giới
thiệu mã bổ sung, gửi các hướng dẫn mới đến ứng dụng để có quyền truy cập vào hệ
thống CNTT.
Nếu những kẻ tấn công biết cách bố trí bộ nhớ của một chương trình, chúng có
thể cố ý cấp dữ liệu đầu vào mà bộ đệm không thể lưu trữ và ghi đè các khu vực chứa
mã thực thi, thay thế nó bằng mã của riêng chúng. Ví dụ, kẻ tấn công có thể ghi đè
một con trỏ (một đối tượng trỏ đến một vùng khác trong bộ nhớ) và trỏ nó đến một
trọng tải khai thác, để giành quyền kiểm soát chương trình.
* Khai thác lỗi tràn bộ đệm trên stack.
- Ghi đè một biến địa phương nằm gần bộ nhớ đệm trong stack để thay đổi hành vi
của chương trình nhằm tạo thuận lợi cho kẻ tấn công.
- Ghi đè địa chỉ trả về trong một khung stack (stack frame). Khi hàm trả về, thực thi sẽ
được tiếp tục tại địa chỉ mà kẻ tấn công đã chỉ rõ, thường là tại một bộ đệm chứa dữ
liệu vào người dùng.
- Nếu không biết địa chỉ của phần dữ liệu người dùng cung cấp, nhưng biết rằng địa
chỉ của nó được lưu trong một thanh ghi, thì có thể ghi đè lên địa chỉ trả về một giá trị
địa chỉ của một opcode mà opcode này sẽ có tác dụng làm cho thực thi nhảy đến phần
dữ liệu người dùng.
- Cụ thể: nếu địa chỉ đoạn mã độc hai muốn chạy được ghi trong một thanh ghi R, thì
một lệnh nhảy đến vị trí chứ opcode cho một lệnh jump R, call R (hay một lệnh tương
tự với hiệu ứng nhảy đến địa chỉ ghi trong R) sẽ làm cho đoạn mã trong phần dữ liệu
người dùng được thực thi.
*Khai thác lỗi tràn bộ đệm trên heap
- Một hiện tượng tràn bộ đệm xảy ra trong khu vực dữ liệu heap được gọi là hiện
tượng tràn heap và có thể khai thác được bằng các kỹ thuật khác với các lỗi tràn
stack.
- Bộ nhớ heap được cấp phát động bởi các ứng dụng tại thời gian chạy và thường chứa
dữ liệu của chương trình.
- Việc khai thác được thực hiện bằng cách phá dữ liệu này theo các cách đặc biệt để
làm cho ứng dụng ghi đè lên các cấu trúc dữ liệu nội bộ chẳng hạn các con trỏ của
danh sách liên kết.
*Một số cách khai thác khác.
- Khai thác dựa vào các lỗ hổng phần mềm thông qua ngôn ngữ lập trình (phần mềm
thường được viết bằng ngôn ngữ C).
- Khai thác các trang web có tương tác người dùng nhưng không ràng buộc dữ liệu
nhập như các trường hợp username, password,...

3.Thiệt hại
Lỗi tràn bộ đệm có thể khiến ứng dụng ngừng hoạt động, gây mất dữ liệu hoặc thậm
chí giúp kẻ tấn công kiểm soát hệ thống hoặc tạo cơ hội cho kẻ tấn công thực hiện
nhiều thủ thuật khai thác khác nhau.
Thiệt hại xấu nhất là tràn bộ đệm gây thiệt hại hàng triệu đô la, thương tích cá nhân và
tử vong.
1. Một trong những trường hợp tử vong đầu tiên được cho là do tràn bộ đệm xảy
ra vào tháng 4 năm 1986; Verdon Kidd nhận được một lượng lớn bức xạ từ
Therac-25, một máy xạ trị điều khiển bằng phần mềm được sử dụng để điều trị
ung thư, và qua đời ngay sau đó. (Trong Kiểm tra Thiết lập này, một thanh ghi
gồm tám bit sẽ chỉ ra các vấn đề. Nếu giá trị thanh ghi bằng 0, thì không có lỗi
nào xuất hiện và quá trình xử lý có thể bắt đầu. Một giá trị khác 0 trong thanh
ghi sẽ chỉ ra rằng các vấn đề vẫn còn và không thể bắt đầu điều trị. Điều mà
lập trình viên của Therac-25 không xem xét là lỗi số 256. Một thanh ghi tám
bit có thể giữ các giá trị từ 0 đến 255. Nếu 255 lỗi xảy ra trong Kiểm tra Thiết
lập và sau đó một lỗi nữa, giá trị thanh ghi sẽ là 0 , và dấu hiệu rằng máy đã
sẵn sàng và có thể bắt đầu điều trị)
2. Sự khởi đầu của sự thừa nhận của thế giới về việc tràn bộ đệm là một vấn đề
xảy ra với Morris Internet Worm khét tiếng vào ngày 2 tháng 11 năm
1988. Được tạo ra bởi một nghiên cứu sinh tiến sĩ Cornell hai mươi ba tuổi,
Robert Tappan Morris, chương trình nhỏ này (chín mươi chín dòng, không bao
gồm cả các tệp đối tượng) đã lây nhiễm trên 6.000 máy tính, gây ra tình trạng
tắt mạng ảo. Một máy tính sẽ không thể sử dụng được trong vòng chưa đầy 90
phút kể từ thời điểm bị lây nhiễm.
3. Sự cố tràn bộ đệm đã xảy ra trong lệnh đăng nhập từ xa (rlogin) và được đưa ra
ánh sáng vào khoảng năm 1998. Lệnh UNIX rlogin cho phép đăng nhập từ xa
từ máy chủ cục bộ vào máy chủ từ xa. (Để làm được điều này một trong những
yêu cầu là cần có thông tin về máy chủ địa phương. Thông tin này được lưu trữ
trong biến môi trường TERM trong bộ nhớ của hệ thống từ xa. Tuy nhiên,
TERM này được sao chép mà không liên quan đến độ dài. Kẻ xâm nhập hiểu
biết có thể sửa đổi thông tin TERM và biến nó thành bất cứ thứ gì kẻ xâm nhập
mong muốn.) Biến môi trường TERM đã sửa đổi này có thể làm tràn bộ đệm
TERM và gây ra tràn bộ đệm. Kết quả của việc tràn bộ đệm này là thông tin
trong biến TERM có thể tràn vào các phần quan trọng của bộ nhớ của thiết bị
đầu cuối từ xa.
4. Tràn bộ đệm xảy ra qua web trên toàn thế giới, bằng chứng là do sự cố Máy
chủ Thông tin Internet của Microsoft (IIS) được công bố trong Lưu ý về Lỗ
hổng bảo mật CERT VU # 669779. Lỗ hổng tràn bộ đệm trong các phiên bản
cụ thể của IIS, có thể cho phép kẻ tấn công có được các đặc quyền cấp trên và
quyền truy cập vào toàn bộ hệ thống. (Theo bản thân Microsoft, có hai loại
tràn bộ đệm xảy ra: (1) bộ đệm có kích thước sai được cấp phát và; (2) không
có giới hạn nào được đặt ra đối với kích thước của đầu vào. Do đó, máy khách
có thể gửi đầu vào sẽ ghi đè hầu hết hoặc toàn bộ bộ nhớ trên hệ thống. Khi
làm như vậy, kẻ tấn công có thể hoạt động như một người dùng hợp pháp của
hệ thống, thậm chí có thể là người dùng gốc.)
5. Sự cố tràn bộ đệm gần đây đã xảy ra trong Phần mềm Mạng Nội dung và Ứng
dụng Cisco (ACNS). Vấn đề này là trọng tâm chính của Ghi chú Lỗ hổng
CERT VU # 352462, được đăng vào tháng 12 năm 2003. Tràn bộ đệm này gây
ra sự cố xác thực. (Bộ đệm mật khẩu của phần mềm này được thiết kế cho các
ký tự đã nhập có kích thước cố định. Bằng cách cung cấp mật khẩu quá dài, có
thể gây ra lỗi tràn bộ đệm trong mô-đun xác thực. Nếu người dùng nhập nhiều
ký tự hơn số ký tự mà bộ đệm nắm giữ, thì lỗi tràn sẽ khiến hệ điều hành bỏ
qua so sánh mật khẩu, kết quả giống như khi xác thực đúng đã được cung cấp.)
Sự cố tràn bộ đệm này có thể cho phép kẻ tấn công thực thi mã tùy ý trên thiết
bị bị ảnh hưởng hoặc gây ra từ chối dịch vụ.

Kaplan, K., Kaplan, J., & Duran, C. (2004, June). BO (Buffer Overflow): Bad for
Everyone. In 2004 Annual Conference (p. 9.260. 3- 9.260. 6).
1. One of the first deaths attributed to buffer overflow occurred in April 1986; Verdon Kidd received
massive doses of radiation from the Therac-25, a software controlled radiation-therapy machine used
for cancer treatment, and died shortly thereafter... To ensure safety, the Therac-25 would perform a
Set-Up Test after a technician entered treatment parameters, prior to engagement. This Set-Up Test
would run through a list of procedures hundreds of times while setting up for one treatment. Within
this Set-Up Test, a flag register of eight-bits would indicate problems. If the flag register value was
zero, then no errors were present and treatment could begin. A non-zero value in the flag register
would indicate that problems remained and treatment could not begin. What the programmer of the
Therac-25 did not consider was error number 256. An eight-bit register can hold values from 0 to 255.
If 255 errors occurred during the Set-Up Test and then one more, the register value would be 0, and
indication that the machine was ready and treatment could begin.
2. The beginning of the world’s acknowledgement of buffer overflow as a problem occurred with the
infamous Morris Internet Worm of November 2, 1988. Created by a twenty-three year old Cornell
doctoral student, Robert Tappan Morris, this small (ninety-nine line, not including object files) program
infected over 6,000 computers, causing a virtual shut-down of the internet. The worm was quick; a
computer would be unusable in less than ninety minutes from the time of infection.
3. A buffer overflow problem occurred in the remote login (rlogin) command and was brought to light
around 1998. This buffer overflow problem is akin to the spilt milk analogy, yet has more sinister
complications. The UNIX command rlogin allows remote login from a local host to a remote host. In
doing this, various operations in set-up are required. One requirement is that information about the
local host is needed. This information is stored in a TERM environment variable in the remote
system’s memory. Yet, this TERM is copied without regard to length. A savvy intruder can modify the
TERM information and make it whatever the intruder desires. This modified TERM environment
variable can overflow the TERM buffer and cause a buffer overflow. The result of this buffer overflow
is that information in the TERM variable can spill into important parts of the remote terminal’s memory.
4. Buffer overflow occurs via the world wide web, as evident by the Microsoft Internet Information
Server (IIS) problem published in the CERT Vulnerability Note VU#669779. A buffer overflow
vulnerability in specific versions of IIS, may allow an attacker to gain upperlevel privileges and access
to the entire system. According to Microsoft itself, there are two types of buffer overflow occurring: (1)
a wrongsized buffer is allocated and; (2) no limits are placed on the size of input. As a result, it would
be possible for a client to send input that would overwrite most or all of the memory on the system. In
doing so, the attacker could act as a legitimate user of the system, perhaps even as the root user.
5. A recent buffer overflow problem has occurred in the Cisco Application and Content Networking
Software (ACNS). This problem is the main focus of the CERT Vulnerability Note VU#352462, posted
in December 2003. This buffer overflow causes an authentication problem. The password buffer of
this software is designed for typed characters of fixed size. By supplying an overly long password, it is
possible to trigger a buffer overflow in the authentication module. If a user types more characters than
the buffer holds, the overflow causes the operating system to bypass password comparison, which
results the same as if a correct authentication had been supplied. This buffer overflow problem may
enable an attacker to execute arbitrary code on the affected device or cause denial of service.
4. Cách phát hiện lỗi Buffer Overflow và biện pháp ngăn chặn

4a. Cách phát hiện lỗi Buffer Overflow


Công nghệ biên dịch lý tưởng nhất để phát hiện là dùng chương trình C hoặc C++
để biết được thông tin về kích thước của dữ liệu trong mã nguồn. Một số thông tin
có thể xuất phát từ lời khai báo của các biến, mô tả kiểu biến được sử dụng. Các
thông tin khác đến từ các lệnh gọi chức năng trong chương trình. Trình biên dịch cần
phải hiểu tất cả các thông tin này để tạo ra mã đúng.

4b. Biện pháp ngăn chặn


Để tránh các nguy cơ bị khai thác lỗi buffer overflow chúng ra cần sử dụng các
biện pháp phòng tránh hiệu quả :
- Lựa chọn ngôn ngữ lập trình: ngôn ngữ lập trình có một ảnh hưởng lớn đối với
sự xuất hiện lỗi tràn bộ đệm.
+Ngôn ngữ lập trình C và C++ là hai ngôn ngữ lập trình thông dụng, nhưng hạn
chế của nó là không kiểm tra việc truy cập hoặc ghi đè dữ liệu thông qua các con trỏ.
Cụ thể nó không kiểm tra dữ liệu copy vào một mảng có phù hợp với kích thước của
mảng hay không. Ngôn ngữ lập trình sử dụng nhiều kỹ thuật đa dạng để tránh gần hết
việc sử dụng con trỏ và kiểm tra biên do người dùng xác định.
+Nhiều ngôn ngữ lập trình khác cung cấp việc kiểm tra tại thời gian chạy. Việc
kiểm tra này cung cấp một ngoại lệ hay một cảnh báo khi C và C++ ghi đè dữ liệu.
- Sử dụng các thư viện an toàn: Sử dụng các thư viện được viết tốt và đã được
kiểm thử dành cho các kiểu dữ liệu trừu tượng các thư viện này thực hiện tự động việc
quản lý bộ nhớ, trong đó có kiểm tra biến có thể làm giảm sự xuất hiện và ảnh hưởng
của các hiện tượng tràn bộ đệm. các thư viện an toàn gồm có: The Better String
Library, Arri Buffer API,..
- Chống tràn bộ đệm trên stack: Stack- smashing protection là kỹ thuật dùng để
phát hiện các hiện tượng tràn bộ đệm phổ biến nhất. Kỹ thuật này kiểm tra xem stack
đã bị sửa đổi hay chưa khi một hàm trả về. Nếu stack đã bị sửa đổi, chương trình kết
thúc bằng một lỗi segmentation fault. Chế độ Data Execution Prevention (cấm thực thi
dữ liệu) của Microsoft bảo vệ các con trỏ và không cho chúng bị ghi đè.Có thể bảo vệ
stack bằng cách phân tán stack thành hai phần, một phần dành cho dữ liệu và một
phần dành cho các bước trả về hàm, sự phân chia này được dùng trong ngôn ngữ
Forth.
- Bảo vệ không gian thực thi: Kỹ thuật này ngăn chặn việc thực thi mã tại stack
hay heap. Hacker có thể sử dụng tràn bộ đệm để chèn một đoạn mã tùy ý vào bộ nhớ
của chương trình, với việc bảo vệ không gian thực thi thì mọi cố gắng chạy đoạn mã
đó sẽ gây ra một ngoại lệ. Một số CPU hỗ trợ tính năng có tin bit NX (No eXecute)
hoặc bit XD (eXecute Disable). Khi kết hợp với phần mềm các tính năng này có thể
được dùng để đánh dấu những trang dữ liệu (chẳng hạn như các trang chứa stack và
heap) là đọc được nhưng không thực hiện được.
- Ngẫu nhiên hóa sơ đồ không gian địa chỉ (Address space layout
randomization ASLR): là một tính năng an ninh máy tính có liên quan đến việc sắp
xếp các vùng dữ liệu quan trọng (thường bao gồm nơi chứa mã thực thi và vị trí các
thư viện, heap và stack) một cách ngẫu nhiên trong không gian địa chỉ của một tiến
trình.
- Kiểm tra sâu đối với gói tin: (deep packet inspection - DPI) có thể phát hiện
việc
cố gắng khai thác lỗi tràn bộ đệm từ xa ngay từ biên giới mạng. Các kỹ thuật này có
khảnăng ngăn chặn các gói tin có chứa chữ ký của một vụ tấn công đã biết hoặc chứa
các chuỗi dài các lệnh No- Operation (NOP – lệnh rỗng không làm gì). Việc rà quét
gói tin không phải một phương pháp hiệu quả vì nó chỉ có thể ngăn chặn các cuộc tấn
công đã biết và có nhiều cách để mã hóa một lệnh NOP.

HẾT

You might also like