Tải bản đầy đủ (.ppt) (58 trang)

Tài Liệu Hacker Sự Tràn Bộ Nhớ Đệm

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.17 MB, 58 trang )

SỰ TRÀN BỘ NHỚ ĐỆM

GVHD: Ths Lê Tự Thanh
Nhóm 13:
Phạm Nguyễn Thanh Hưng
Hà Xuân Hải


TIN TỨC BẢO MẬT
THÔNG TIN TRONG TUẦN
Lỗi ngày trở về 0 vượt qua sự kiểm soát của Người sử dụng Windows.
Sự tràn bộ nhớ đệm cục bộ là thủ thuật đánh lừa hệ điều hành của
Microsoft để hệ thống cấp quyền sử dụng riêng cho kẻ tấn công.
Nhiều phiên bản của hệ điều hành Microsoft dễ bị tổn thương nhưng không
được tiết lộ, việc tràn bộ đệm ngày về 0 có nguy cơ bị tổn thương mà qua
đó cho phép một kẻ tấn công chiếm được quyền của hệ thống và kiểm soát
máy tính.
Theo nghiên cứu của công ty bảo mật Vupen, “vấn đề này gây ra bởi một lỗi
tràn bộ đệm trong bộ xử lý ‘win32k.sys’ khi lưu trữ các giá trị registry đã
được xử lý với ‘reg_binary’, mà qua đó có thể cho phép người dùng không
có đặc quyền phá bỏ sự quản lý của hệ thống hoặc thực thi mã nhị phân với
hạt nhân (hệ thống) đặc quyền, bằng cách thay đổi các giá trị registry liên
quan tới người dùng cuối được xác định bằng ký tự (EUDC) qua phông chữ.
Theo tổ chức nghiên cứu an ninh Chester Wisniewski tại Sophos, một kẻ tấn
công có thể sử dụng mã khóa liên quan tới EUDC “để mạo danh tài khoản
hệ thống, và có quyền truy cập gần như không giới hạn cho tất cả các thành
phần của hệ thống Windows”.


CÁC CHỦ ĐỀ TRONG MODULE
Sự tràn bộ nhớ đệm (BoF).


Tràn bộ nhớ đệm trên stack (ngăn xếp)
Tràn bộ nhớ đệm trên heap
Điều khiển stack
Các bước tràn bộ nhớ đệm
Cách thức tấn công một chương trình
thực
Sự phá vỡ stack
Ví dụ của tràn bộ nhớ đệm

Làm cách nào khai thác sự biến đổi
của việc tràn bộ nhớ đệm
Xác định tràn bộ nhớ đệm
Điều kiện kiểm tra tràn bộ nhớ đệm
trên heap: heap.exe
Các bước kiểm tra việc tràn bộ nhớ
đệm trên stack trong chương trình sửa
lỗi OllyDbg
Công cụ phát hiện tràn bộ nhớ đệm
Phòng chống tràn bộ nhớ đệm
Công cụ đối phó với việc tràn bộ nhớ
đệm
Bút kiểm tra tràn bộ nhớ đệm


BIỂU ĐỒ MODULE
Khái niệm
tràn bộ nhớ
đệm

Công cụ

bảo mật
tràn bộ nhớ
đệm

Phương
pháp luận
tràn bộ nhớ
đệm

Bút kiểm
tra tràn bộ
nhớ đệm

Biện pháp
đối phó
tràn bộ
đệm

Ví dụ tràn
bộ nhớ đệm

Phát hiện
tràn bộ nhớ
đệm


Lỗi tràn bộ đệm tổng quát xảy ra khi một bộ nhớ đệm đã được phân chia cho một không gian lưu trữ cụ thể có chứa
nhiều dữ liệu được sao chép vào lớn hơn mức mà nó có thể xử lý.
Khi chương trình được biên dịch và chạy, nó sẽ chỉ định một phần của bộ nhớ có độ dài 11 bytes để chứa chuỗi tấn
công.

Hàm Strcpy sẽ sao chép chuỗi “DDDDDDDDDDDDDD” vào chuỗi tấn công, lúc này bộ đệm sẽ vượt quá kích thước 11
bytes, dẫn tới tràn bộ đệm.

Đây là loại dễ bị tổn
thương trong hệ thống
dựa trên UNIX và NT.


Tại Sao Các Chương Trình Và Ứng
Dụng Dễ Bị Tổn Thương ?
Phương thức kiểm tra biên không được thực
hiện đầy đủ hoặc, trong nhiều trường hợp,
chúng bị bỏ qua hoàn toàn.
Ngôn ngữ lập trình, chẳng hạn như C, có các
lỗ hổng bảo mật trong chính chúng.
Chương trình và các ứng dụng không tuân thủ
đúng các hoạt động mà chúng được lập trình.
Các chức năng trong ngôn ngữ lập trình C như strcat(), strcpy(), sprintf(),
vsprintf(), bcopy(), gets() và scanf() có thể bị khai thác như việc chúng không
kiểm tra kích thước của bộ đệm.


Tìm Hiểu Về Stack
Stack sử dụng cơ chế Last-InFirst-Out (vào sau ra trước) để
truyền hàm tham số và tham
chiếu với các biến cục bộ.
Nó hoạt động như một bộ đệm,
giữ tất cả các thông tin mà hàm
cần.
Được tạo ra vào thời điểm bắt

đầu của hàm và giải phóng lúc
kết thúc hàm.

Phần
dưới
của bộ
nhớ

BP tại
các nơi
bên
trong
khung
stack

Các điểm SP ở
đây

Bộ Đệm2
(biến cục bộ 2)

Hướng đi
vào

Bộ Đệm1
(biến cục bộ 1)
Điểm quay trở về

Phần
trên

của bộ
nhớ

Chức năng gọi
các đối số

Hướng tăng
của stack


Phần dưới của
Stack
Dữ liệu trên đoạn
stack.

Phần dưới của
Stack

Phần dưới của
Stack

Dữ liệu trên đoạn
stack.

Dữ liệu trên đoạn
stack.

Địa chỉ quay về

Các dữ liệu khác

trên đoạn stack
Phần cuối của Stack
Một Stack bình thường

Stack khi bị kẻ tấn công gọi
một chức năng

Một số dữ liệu
có thể bị ghi đè

Địa chỉ quay về mới

Dữ liệu
mới

Dữ liệu bị ghi đè
trên đoạn stack

Phần cuối của Stack
Stack sau khi bị một chức
năng phá hoại.


Tìm Hiểu Về Heap
Heap là một khu vực của bộ nhớ được sử dụng bởi một ứng dụng và được
cấp phát động tại thời gian chạy của các hàm, chẳng hạn như malloc().
Các biến tĩnh được lưu trữ trên stack cùng với dữ liệu được giao, sử dụng
giao diện malloc.
Heap lưu trữ tất cả các trường hoặc thuộc tính, hàm tạo và phương thức của
một lớp hoặc một đối tượng.


Dung lượng
bộ nhớ
Trường điều
khiển

Trường điều
khiển

Dung lượng
bộ nhớ

Dung lượng
bộ nhớ

Dung lượng Heap đơn giản

Trường điều
khiển


Sự Tràn Bộ Nhớ Đệm Trên Heap
Nếu một ứng dụng sao chép dữ liệu mà không kiểm tra dù nó phù hợp với nơi được sao chép tới, thì kẻ tấn
công có thể cung cấp một lượng lớn dữ liệu cho ứng dụng đó, thực hiện ghi đè lên thông tin quản lý của heap.
Kẻ tấn công làm một bộ nhớ đệm bị tràn trên phần dưới của heap, ghi đè lên các biến động khác gây nên các
biến đổi bất ngờ và không mong muốn.

Lưu ý: trong hầu hết các môi trường, điều này sẽ cho phép kẻ tấn công kiểm soát được việc thực thi của
chương trình.



Hoạt Động Của Stack
"Hủy bỏ" một
mục trên
cùng của ngăn
xếp

Pop

Các hoạt động
quan trọng của
ngăn xếp.

Push

Đặt một mục
lên trên đỉnh
của ngăn xếp.

Hoạt động của Push và Pop
Quay trở về nội dung được chỉ bởi con trỏ
và thay đổi con trỏ.

Mở rộng con trỏ lệnh
hiện hành (EIP)
EIP trỏ đến đoạn mã mà bạn
đang thực hiện. Khi bạn gọi
một hàm, chúng sẽ được lưu
trữ trên ngăn xếp để sử
dụng sau.


Mở rộng con trỏ Stack
(ESP)
ESP trỏ đến vị trí hiện tại trên ngăn
xếp và cho phép vài thứ được thêm
vào và loại bỏ từ ngăn xếp bằng
cách sử dụng hoạt động push và
pop hoặc thao tác trực tiếp con trỏ
ngăn xếp.

Mở rộng con trỏ nền
(EBP)

Các máy chủ EBP như một điểm
tĩnh để tra cứu thông tin trên
ngăn xếp giống như các biến và
dữ liệu trong một hàm sử dụng
các hiệu số.


Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ hổng
của một phần mềm.
Bộ đệm là mục tiêu ưu thích của các kẻ tấn công vì chúng rất dễ tràn
nếu xảy ra điều kiện phù hợp.
Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác các lỗ hổng
trong ngăn xếp và bộ nhớ quản lí heap.


Không Xử Lý (NOPs)
Hầu hết các CPU đều có một

lệnh No Operation (Không
hoạt động) – nó không làm
gì nhưng thúc đẩy lệnh con
trỏ.
Thông thường, bạn có thể
đặt một trong số chúng
trước chương trình của bạn
(trong chuỗi).

Hầu hết các xâm nhập hệ
thống phát hiện (IDSs) bằng
cách tìm kiếm chữ ký trượt
của NOP.

Kẻ tấn công các miếng đệm
nhằm mục đích bắt đầu lỗi
tràn bộ đệm bằng các lệnh
dài hạn của NOP (một NOP
chuyển động hoặc trượt) vi
thế CPU sẽ không làm gì cả
cho tới khi nó nhận được “sự
kiện chính” (trước “con trỏ
quay về).
ADMutate (bởi K2) chấp nhận
một lỗi tràn bộ đệm nhằm
khai thác như là đầu vào và
ngẫu nhiên tạo ra một phiên
bản có chức năng tương
đương (đa hình).



BIỂU ĐỒ MODULE

Khái niệm
tràn bộ nhớ
đệm

Công cụ bảo
mật tràn bộ
nhớ đệm

Phương
pháp luận
tràn bộ nhớ
đệm

Bút kiểm tra
tràn bộ nhớ
đệm

Biện pháp
đối phó tràn
bộ đệm

Ví dụ tràn
bộ nhớ đệm

Phát hiện
tràn bộ nhớ
đệm



Kiến Thức Cần Thiết Để Khai Thác Lỗi Tràn Bộ Đệm Trong
Chương Trình
Hiểu biết về hoạt
động của bộ nhớ
stack và heap

Hiểu biết về cách hệ
thống gọi công việc
ở cấp độ mã máy

Kiến thức về lắp ráp
và ngôn ngữ máy

Quen với các công
cụ biên dịch và sửa
lỗi như gdb

Kiến thức ngôn ngữ
lập trình C và Perl


Các Bước Tràn Bộ Đệm

Bước 1
Tìm sự hiện diện và vị trí
của lỗ hổng tràn bộ đệm

Bước 3

Ghi đè lên địa chỉ quay về
của hàm.

Bước 2
Ghi nhiều dữ liệu vào bộ
đệm hơn mức mà nó có
thể xử lý.

Bước 4
Thay đổi luồng thực hiện
hàm bằng các mã hacker.


Tấn Công Một Chương Trình Thực
Giả sử rằng một hàm chuỗi bị khai thác, kẻ tấn công
có thể gửi một chuỗi dài đầu vào.

Con trỏ trả về của hàm tiến hành ghi đè, và kẻ tấn
công thành công trong việc thay đổi luồng thực
hiện lệnh.
Nếu người sử dụng chèn vào mã đầu vào, anh
ta hoặc cô ta có thể biết chính xác địa chỉ và
kích thước của ngăn xếp và làm con trỏ trở về
hướng tới đoạn mã của mình để thực hiện chỉ
thị.


Chuỗi Định Dạng Có Vấn Đề
Có vấn đề nếu người dùng =“%%
%%%%%%%%%”


Trong C, xét ví dụ của chuỗi định
dạng có vấn đề.

Int func(char *user)
{
Fprintf ( stdout, user);
}

Chương trình có thể sụp đổ gây ra
một Dos.
Nếu không, chương trình sẽ in nội
dung bộ nhớ
Lỗi toàn diện xảy ra bằng cách sử
dụng người dùng =“%n”

Hình thức đúng
Int func (char *user)
{
Fprintf ( stdout,
“%s”, user) ; }


Gây Tràn Bộ Đệm Bằng Cách Sử Dụng Chuỗi Định
Dạng
Trong C, xét ví dụ của BoF sử dụng
chuỗi định dạng có vấn đề.

Như thế nào nếu người dùng =
“%500d <nop> <shellcode>”

Sẽ bỏ qua giới hạn “%400s”
Sẽ tràn biến outbuf.


Phá Vỡ Stack
Ý tưởng chung là gây
ra tràn bộ đệm để sau
đó ghi đè lên địa chỉ
trả về.
Tràn bộ nhớ đệm cho
phép chúng ta thay đổi
địa chỉ trả về của một
hàm.

Khi hàm được thực
hiện xong nó sẽ nhảy
tới bất kỳ địa chỉ nào
trên ngăn xếp.

Đặt một số mã trong bộ
đệm và thiết lập địa chỉ
trở về.


Một Khi Stack Bị Phá Vỡ

Được phép truy cập

Một khi quy trình dễ tổn thương bị chiếm, kẻ tấn công có các đặc
quyền tương tự như quy trình và có thể điều khiển truy cập bình

thường.

Sau đó anh ta hoặc cô ta có thể
khai thác một lỗi tràn bộ đệm
cục bộ để đạt được quyền truy
cập của siêu người dùng.

Sử dụng Netcat
Tạo một cửa sau
Sử dụng (UNIX cụ thể) inetd
Sử dụng FTP ít quan trọng (TFTP) bao gồm
cả Windows 2000 và một số UNIX đặc thù.

Sử dụng Netcat để làm thô và
kết nối tương tác.
Giao diện UNIX cụ thể.
Chụp lại một kết nối đầu cuối X.


BIỂU ĐỒ MODULE

Khái niệm tràn
bộ nhớ đệm

Công cụ bảo mật
tràn bộ nhớ
đệm

Phương pháp
luận tràn bộ nhớ

đệm

bút kiểm tra
Bút tràn
kiểmbộ
tranhớ
tràn
bộ nhớ
đệm
đệm

Biện pháp đối
phó tràn bộ đệm

Ví dụ tràn bộ
nhớ đệm

Phát hiện tràn
bộ nhớ đệm


Lỗi Tràn Bộ Đệm Không Thể Kiểm Soát Đơn Giản
Ví dụ của việc tràn ngăn xếp không thể kiểm soát.
/*Đây là một chương trình cho thấy một lỗi tràn
không thể kiểm soát đơn giản trên ngăn xếp*/

/*sao chép 20 bytes của A và bộ đệm*/
Return 1; /*quay trở lại, điều này sẽ gây ra một truy cập
trái phép do việc các ngăn xếp tham nhũng*/
/*gọi các chức năng của chúng ta*/

/*in ra một tin nhắn ngắn, việc thực thi sẽ không thể
tiến hành được vì thời điểm này bộ đệm bị tràn*/
/*rời khỏi các chức năng chính*/

Ví dụ của việc tràn heap không thể kiểm soát
/*đơn giản nhất của việc tràn heap*/


Tràn Bộ Đệm Đơn Giản Trong C
Chương trình C dễ bị tổn thương overrun.C

Điều đầu tiên của bất kì chương trình nào là
khai báo hai chuỗi biến và cấp phát bộ nhớ
cho chúng.
“Tên” biến sẽ lấy 10 byte của bộ nhớ (mà sẽ
cho phép nó giữ một chuỗi 10 ký tự).
“Các lệnh nguy hiểm tới hệ thống” có biến
dài 128 byte.
Bạn phải hiểu rằng trong C, khối bộ nhớ cho
các biến sẽ được đặt trực tiếp bên cạnh
nhau trong không gian bộ nhớ ảo dành cho
chương trình.


Mã Phân Tích
“Mã nhận được”, thứ đọc một chuỗi từ đầu vào tiêu chuẩn đến vị trí quy định của bộ nhớ,
không có đặc điểm kỹ thuật “chiều dài”.
Điều này có nghĩa là nó sẽ đọc các ký tự mà nó thấy cần thiết để kết thúc dòng, ngay cả
khi nó vượt qua vị trí cuối cùng được phân bổ của bộ nhớ.
Nếu biết được điều này, một kẻ tấn công có thể gây tràn bộ nhớ “tên” hướng tới bộ

nhớ “các lệnh nguy hiểm”, và chạy bất kỳ lệnh nào mà anh ấy hay cô ấy muốn.

Để biên dịch chương trình overrun.c, chạy
lệnh này trong Linux.

Địa chỉ cho biến “lệnh hệ thống nguy hiểm” là 16
byte bắt đầu từ biến “tên”.
6 byte thêm là chi phí được sử dụng bởi hệ thống
“maHoc” để cho phép bộ nhớ trở lại để sử dụng
chung khi nó được giải phóng

Tràn đầu ra bộ đệm


×