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ỗitrà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 đó
Trang 1SỰ 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
Trang 2TIN TỨC BẢO MẬT
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 Microsof để 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 Microsof 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átmá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ỗitrà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ớihạt nhân (hệ thống) đặc quyền, bằng cách thay đổi các giá trị registry liênquan 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ấncô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ànhphần của hệ thống Windows”
CÁC CHỦ ĐỀ TRONG MODULE
Trang 3Cá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
Khái niệm tràn bộ nhớ đệm
Phương pháp luận tràn bộ nhớ đệm
Công cụ bảo mật tràn bộ nhớ
Bút kiểm tra tràn bộ nhớ đệm
Trang 4Ví dụ tràn bộ nhớ đệm
Biện pháp đối phó tràn bộ đệ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.
Trang 5Tại Sao Các Chương Trình Và Ứ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.
Tìm Hiểu Về Stack
Trang 6Stack sử dụng cơ chế
Last-In-First-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
Phần trên của bộ
Hướng đi vào
Hướng tăng của stack nhớ
Trang 7Phần dưới 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
Dữ liệu trên đoạnstack
Một số dữ liệu
có thể bị ghi đè
Địa chỉ quay về Địa chỉ quay về mới
Các dữ liệu khác trên đoạn stack
Dữ liệu Dữ liệu bị ghi đè
trên đoạn stack mới
Phần cuối của Stack Phần cuối của Stack
một chức năng Stack năng sau khi phá bị hoại một chức
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
stack. Dữliệutrênđoạn
Một Stack bình thường Stack khi bị kẻ tấn công gọi
Trang 8một lớp hoặc một đối tượng.
Trang 9Lư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 quan trọngđộng
ngăn xếp.
Push Đặt một mục
lên trên đỉnh của ngăn xếp.
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.
HoạtđộngcủaPushvàPop
Quay trở về nội dung được chỉ bởi con trỏ
và thay đổi con trỏ.
Mở rộng con trỏ Stack
(ESP)Cáchoạt của
Trang 10ESP 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
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.
Trang 11BIỂU ĐỒ MODULE
Khái niệm tràn bộ nhớ
đệm
Trang 12Công cụ bảo mật tràn bộ nhớ đệm
Bút kiểm tra tràn bộ nhớ đệm
Ví dụ tràn
bộ nhớ đệm
Biện pháp đối phó tràn
bộ đệm
Phát hiện tràn bộ nhớ đệm
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
Quen với các công
cụ biên dịch và sửa lỗi như gdb
Trang 13Bước 4
Thay đổi luồng thực hiện hàm bằng các mã hacker.
Trang 14Tấ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ị.
Có vấn đề nếu người dùng
Trang 15Fprint ( 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.
Trang 16Đặt một số mã trong bộ đệm và thiết lập địa chỉ trở 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.
Trang 17Tạo một cửa sau
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
Phương pháp luận tràn bộ nhớ đệm
Công cụ bảo mật tràn bộ nhớ đệm
bút kiểm tra
Ví dụ tràn bộ nhớ đệm tràn ộ tràn
đ đ
Trang 18Biện pháp đối phó tràn bộ đệm
Phát hiện tràn
bộ nhớ đệm
Ví dụ của việc tràn ngăn xếp không thể kiểm soát Ví dụ của việc tràn heap 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*/ /*đơn giản nhất của việc tràn heap*/
/*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*/
Tràn Bộ Đệm Đơn Giản Trong C
Trang 19Chươ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ớ
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 kz 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. Tràn đầu ra bộ đệm
Trang 20Đị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
Chú thích có thể được định
Thêm “@” sau “/*”
Thêm “@” sau “/*” (được xem là chú
thích trong C) được công nhận như cú
pháp các thực thể bởi công cụ LCLint.
Như vậy, trong một tham số khai báo,
nó cho giá trị thông qua tham số này
có thể không trống.
VD:/*@thisvalueneednotbenull@*/
nghĩa bởi các mệnh đề sử dụng LCLint.
Các giả định miêu tả về bộ đệm có thể được thông qua hàm.
Các trạng thái của bộ đệm bị hạn chế khi các hàm giả định quay trở
về và bị hạn chế sử dụng trong các
ví dụ sau: minSet, maxSet, minRead và maxRead.
Làm Thế Nào Để Khai Thác Lỗi Tràn Bộ Đệm
Đối với phần NOP Đối với “Các sự kiện
Trang 21chính” Đối với “Con trỏ quay về”
Ngẫu nhiên thay thế các
NOPs với các phân đoạn
chức năng tương đương
của mã (e.g.: x++; x-;
?NOP NOP)
Áp dụng XOR để kết hợp
mã với một khóa khó hiểu ngẫu nhiên cho IDS Các mã CPU cũng phải giải mã các mã không hiểu được trong thời gian chạy chương trình giải mã.Bởi thế, bộ giải mã trở thành đa hình và rất khó để phát hiện.
Ngẫu nhiên chỉnh sửa LSB của con trỏ hướng tới khu vực của NOP.
BIỂU ĐỒ MODULE
Khái niệm tràn
bộ nhớ đệm
phương pháp luận tràn bộ nhớ đệm
Trang 22công cụ bảo mật tràn bộ nhớ đệm
bút kiểm tra tràn bộ nhớ đệm
ví dụ tràn bộ nhớ đệm
biện pháp đối phó tràn bộ đệm
phát hiện tràn
bộ nhớ đệm
Xác Định Tràn Bộ Nhớ Đệm
Chạy máy chủ web
trên máy cục bộ
Phát yêu cầu với mọi thẻ dài, thẻ kết thúc với “$$$$$”
Nếu máy chủ web bị treo, tìm kiếm nơi tập kết lõi của “$$$$$” để tìm kiếm vị trí tràn.
Sử dụng IDA-Proto để
xây dựng lại nơi bị
khai thác
Sử dụng bộ phận phân tách và trình gỡ rối
Trang 23Sử dụng các công cụ
tự động như codeBlocker, eEye Retina, …
Làm Thế Nào Để Phát Hiện Lỗi Tràn Bộ Đệm Trong Một Chương Trình ?
Biến cục bộ
Trong trường hợp này, kẻ tấn công
có thể làm cho các chuỗi khai báo trông giống như các biến cục bộ trong các hàm hoặc các phương thức, và xác nhận sự có mặt của các ranh giới kiểm tra.
Nó là điều kiện cần thiết để kiểm tra việc sử dụng có phù hợp với các hàm tiêu chuẩn, đặc biệt là các việc liên quan tới chuỗi và đầu vào hoặc đầu ra.
Các hàm tiêu chuẩn
Một cách khác là cung cấp các ứng dụng với số lượng lớn dữ liệu và kiểm tra các
hành vi bất thường.
Trang 24BOU (Tiện Ích Tràn Bộ Đệm)
Các công cụ BOU có thể được sử dụng bởi một kẻ tấn công nhằm
kiểm tra các ứng dụng Web để tạo điều kiện cho lỗi tràn bộ đệm.
Ví dụ của tập tin ‘request’
Công cụ này cần hai
đầu vào Các tập tin “yêu cầu”, dùng để kiểm tra Cách thức để nhiều mã cùng tấn công (quy
định trong một tập tin gọi là “lệnh”).
Nó lấy một tập tin yêu cầu để kiểm tra và xuất ra tất cả các hoạt động
tới STDOUT dựa trên mức độ của quy định tính dài dòng.
Ví dụ của tập tin ‘command’
Kiểm Tra Điều Kiện Tràn Heap
Trang 25Kiểm tra tràn heap bằng
cách cung cấp các chuỗi
đầu vào dài hơn dự kiến.
1 Một trao đổi con trỏ
diễn ra sau khi trình quản
lí thường xuyên heap đi
vào hoạt động.
Hai thanh ghi EAX và ECX,
có thể được đặt cùng với địa chỉ mà người sử dụng cung cấp.
1 Một trong các địa chỉ có thể hướng tới một con trỏ hàm để tiến hành ghi đè,
ví dụ UEF (bộ lọc ngoại lệ chưa xử lý).
.
2 Các địa chỉ khác có thể
là địa chỉ của mã người dùng cung cấp cần phải được thực hiện.
Khi lệnh MOV hiển thị trong khung bên trái của ảnh chụp màn hình
được thực hiện, việc ghi đè được diễn ra Khi các hàm được gọi, mã
người dùng cung cấp được thực thi.
Các Bước Thử Nghiệm Tràn Ngăn Xếp
Trong OllyDbg Debugger.
Thử Nghiệm Tràn Ngăn Xếp Trong OllyDbg
Trang 26Biểu diễn cách thức mà một kẻ tấn công có thể ghi đè lên con trỏ lệnh
Một dãy lớn các ký tự chẳng hạn như “A”, có thể được cung cấp trong trường tham số được hiển thị.
Mở trình thực thi với các đối số được cung cấp
(AAAAAAAA
…) và tiếp tục thực hiện, kết quả được hiển thị trong
EIP bao gồm các giá trị
“41414141”
tượng trưng cho hệ thập lục phân
Trang 27Ví dụ một yêu cầu chính đáng như
Thử Nghiệm Định Dạng Chuỗi Điều Kiện Sử Dụng IDA Pro.
Kẻ tấn công xác định sự hiện diện của
một lỗ hổng định dạng chuỗi bằng cách
Trang 28kiểm tra các trường hợp của mã (ráp
mảnh)
Khi rã mảnh được kiểm tra bằng cách sử
dụng IDA Pro.
•Địachỉcủamộtloạiđịnhdạngxácđịnh
đượcđẩyvàongănxếphiểnthịrõtrướckhi
lệnhgọitớiprintđượcthựchiện
Công Cụ Phát Hiện Tràn Bộ Nhớ Đệm (BoF) BOU (Tiện ích tràn bộ đệm)
Trang 29BIỂU ĐỒ MODULE
Khái niệm tràn
bộ nhớ đệm
Phương pháp luận tràn bộ nhớ đệm
Công cụ bảo mật tràn bộ nhớ đệm
Bút kiểm tra tràn bộ nhớ đệm
Ví dụ tràn bộ nhớ đệm
Biện pháp đối phó tràn bộ đệm
Phát hiện tràn
bộ nhớ đệm
Trang 30Ngăn Chặn Tấn Công BoF
Sử dụng các loại ngôn ngữ an toàn
(Java, ML)
Đánh dấu ngăn xếp như là không
được thực hiện, đặt vị trí ngăn
xếp ngẫu nhiên
Phân tích
mã nguồn tĩnh
Trang 31Thực hiện kiểm tra thời gian thực
Địa chỉ rắc rối
Đặt ngẫu nhiên vị trí của hàm trong libc
Lập Trình Các Biện Pháp Đối Phó
Thiết kế chương trình với trọng
tâm bảo mật Vô hiệu hóa việc thực thi ngăn xếp (có thể thực hiện trên Solaris)
nguy hiểm: gets, strcpy, …
Trang 32Ngăn chặn địa chỉ trả về bị ghi
nhạy cảm không bị ghi đè Lập Trình Các Biện Pháp Đối Phó
Hãy thay đổi bản thân ngôn ngữ C ở cấp độ ngôn ngữ để giảm nguy cơ tràn bộ đệm
Sử dụng phân tích mã nguồn tĩnh hoặc động ở cấp độ mã nguồn
để kiểm tra mã của các vấn đề tràn bộ đệm Thay đổi các trình biên dịch ở cấp độ biên dịch để giới hạn kiểm tra hoặc bảo vệ các địa chỉ từ thanh ghi đè.
Thay đổi các quy tắc ở cấp độ hệ điều hành để các trang bộ nhớ được phép chứa các số liệu thực thi
Hãy sử dụng các thư viện an toàn Hãy sử dụng các công cụ có thể phát hiện lỗ hổng tràn bộ đệm
Chống Thực Thi Dữ Liệu (DEP)
Trang 33DEP là một tập hợp của các công nghệ phần
cứng và phần mềm theo dõi chương trình để
Khi một tiến trình xảy ra phần cứng thi hành
lệnh DEP phát hiện mã đang chạy từ các địa
điểm này và đặt ra một ngoại lệ.
Để ngăn chặn các mã độc hại lợi dụng cơ chế xử
lý ngoại lệ trong Windows cần sự giúp đỡ bởi
phần mềm thi hành lệnh DEP.
DEP giúp sức trong việc ngăn chặn các mã thực
thi từ các trang dữ liệu, chẳng hạn như các
trang heap mặc định, các trang bộ nhớ pool, và
các trang stack khác nhau, nơi mà mã không
thực hiện được từ heap và stack mặc định.
Enhanced Mitigation Experience Toolkit (EM ET)
Enhanced Mitigation Experience Toolkit (EMET) được thiết kế để tăng khó khăn cho kẻ tấn
Trang 34công trong việc khai thác các lỗ hổng của phần mềm và truy cập vào hệ thống.
Nó hỗ trợ các kỹ thuật giảm thiểu nhằm ngăn ngừa các kỹ thuật tấn công phổ biến, chủ yếu liên quan đến tràn ngăn xếp và các kỹ thuật được sử dụng bởi malware để tương tác với hệ điều hành bằng phương pháp thỏa hiệp.
Nó cải thiện khả năng phục hồi của Windows để khai thác lỗi tràn bộ đệm
Nó ngăn ngừa các kỹ thuật phổ biến sử dụng để khai th ác
lỗi tràn ngăn xếp trong Windows bằng việc thực hiệ n
xác nhận chuỗi SHE.
Nó đánh dấu các phần của một tiến trình bộ nhớ không được thực thi, gây khó khăn trong việc khai thác các lỗ hổng tham nhũng bộ nhớ.
Điều mới trong EMET 2.0 là bắt buộc địa chỉ không gian bố trí ngẫu nhiên (ASLR), cũng như các module phi nhận thức ASLR trên tất cả các phiên bản Windows mới.
Bộ xử lý cấu trúc ngoại lệ bảo vệ Phòng chống thực thi dữ liệ
u Địa chỉ không gian bố trí ngẫu
việc ghi đè (SEHOP) động (DDEP) nhiên (ASLR)
Cài Đặt Cấu Hình Hệ Thống EMET
Trang 35Sử dụng hộp thoại Application Configuration, chúng
ta có thể thêm các ứng dụng để cấu hình cho EMET Điều này giúp cho các ứng dụng cứng không bị biên dịch (bởi nhà cung cấp gốc) với các biện pháp bảo mật cụ thể.
Khái niệm trà n
bộ nhớ đệm
Phương pháp luận tràn bộ nhớ đệm
Công cụ bảo mật tràn bộ nhớ đệm
Bút kiểm tra tràn bộ nhớ đệm
Ví dụ tràn bộ nhớ đệm
Trang 36Biện pháp đối phó tràn b ộ
bài tập áp dụng mã hóa kém của
các lập trình viên khi viết và xử lý
các hàm chuỗi C và C++.
Trình biên dịch chuyển đổi /GS có
thể được kích hoạt từ trang tùy
chọn thế hệ mã trên thẻ C/C++
Cookie
Bộ chuyển đổi /GS cung cấp một
“va chạm tốc độ”, hoặc cookie, giữa
bộ đệm và địa chỉ trở về hữu ích
trong ngăn chặn tràn bộ đệm
Nếu một lỗi tràn ghi lên địa chỉ trả
về, nó sẽ phải ghi đè lên các tập tin
Các thanh ghi lưu Calle
nhớ đ ện