Trao đổi với tôi

http://www.buidao.com

3/3/10

[Hacking] Lỗi tràn bộ đệm (1)

1. Sơ lược lịch sử

Nếu có một Y2K Bug thật sự thì nó phải là lỗi tràn bộ đệm (buffer overflow bug). Đây là lỗi phổ biến nhất trong các chương trình quan trọng của hệ điều hành và mạng máy tính, bao gồm cả các cơ sở dữ liệu. Lỗi này, trong nhiều trường hợp, cho phép kẻ xâm nhập (intruder) truy cập vào hệ thống nội bộ với đặc quyền của root, hoặc ít nhất là có thể phá hoại rất nguy hiểm (xem các ví dụ dưới đây).

Có hai loại lỗi tràn bộ đệm chính: loại tràn stack (stack-based) và loại tràn heap (heap-based). Gần đây còn có lọai tràn số nguyên (integer overflow) cũng tương tự về nguyên tắc của sự tràn. Ý tưởng căn bản là làm cho dữ liệu tràn vào vùng nhớ chứa thông tin hệ thống. Ví dụ: khi dữ liệu tràn xuống stack của một hàm (function) đang chạy thì dữ liệu có thể đè vào địa chỉ trả về (return address) của hàm làm cho nó trỏ đi chỗ khác. Intruder có thể bỏ một đoạn mã vào “chỗ khác” này để phá phách, truy cập dữ liệu, vân vân. (Chỗ khác này thường là nằm ở chính bộ đệm đang bị tràn.)

Khi mà một quá trình (process) của hệ thống chạy với đặc quyền root, thì lỗi tràn bộ đệm của process này có thể cho phép intruder chạy chương trình với đặc quyền root. Vì thế lỗi này cực kỳ nguy hiểm.

Các khuyến cáo bảo mật của CERT [1] từ 1988 đến nay đã báo hơn 60 lỗi tràn bộ đệm trong các chương trình quan trọng nhất của các hệ thống Windows, Unix, Linux, như MS SQL Server, IIS, Sendmail, httpd, syslogd (nhiều phiên bản và implementations khác nhau đều bị), vân vân. Con số 60 là khá lạc quan, các diễn đàn bảo mật trên Internet báo ra nhiều lỗi hơn nhiều. Bạn có thể tham khảo các websites như SecuriTeam [2], Security Focus [3], @stake [4], hoặc BugTraq mailing list [5] để thấy các ví dụ về các cảnh báo này. Bài viết ở đây [6] có thu thập tổng quan tương đối đầy đủ về lỗi tràn bộ đệm cho đến năm 2000.

Lần đầu tiên lỗi tràn bộ đệm nổi đình nổi đám trên báo chí là ngày 2 tháng 11 năm 1988, khi Robert Tappan Morris [7] (Robert Morris Jr.) – đang học sau đại học ở đại học Cornell – viết thí nghiệm một chương trình có thể tự động “tiêm” bản thân vào Internet. Robert không có ý định làm cho nó lây lan ra nhiều lắm, nhưng bản thân con sâu [8] (worm) của anh ta lại có bug, làm cho nó lan nhanh hơn anh tưởng nhiều lần. Về căn bản, con sâu Internet của Robert tận dụng lỗi tràn bộ đệm trong deamon fingerd của Unix. Một điểm thú vị ít được biết hơn là thời điểm đó cha đẻ của Robert – ông Robert Morris Sr. – đang là khoa học gia đứng đầu của national security agency [9] (NSA).

Sự kiện thứ hai đánh dấu sự lan tràn của kiến thức về lỗi tràn bộ đệm là sự xuất hiện của bài viết “phá stack cho vui và kiếm lợi [10]” của Aleph One năm 1996 trong tạp chí Phrack [11], tạp chí “ngầm” (underground) có truyền thống nhất trong giới hackers. Aleph One (dĩ nhiên là bí danh) đã viết nhiều ví dụ mã vỏ (shellcodes) và vài phương pháp tổng quát để lợi dụng lỗi này trong các hệ thống máy tính khác nhau. Bài viết này của Aleph One, dù bây giờ đã hơi lỗi thời, vẫn được xem là bửu kíp kinh điển của các lọai khai thác lỗi tràn bộ đệm.

(Aleph Naught – trong lý thuyết tập hợp của Cantor [12] – là lực lượng của tập số tự nhiên, còn Aleph One là lực lượng của tập tất cả các tập con của tập số tự nhiên: bậc vô hạn kế tiếp. Tôi không biết Aleph One có đặt tên mình theo nghĩa này hay không, nhưng tôi không biết nghĩa nào khác của chữ Aleph One. Tạp chí Phrack năm nay sẽ ra bộ cuối cùng rồi đóng cửa, tiếc thật.)

Sau bài của Aleph One, nhiều bài khác cũng được đăng hoặc phát tán trên Internet, mô tả chi tiết các cách tấn công vào nhiều hệ điều hành khác nhau, chạy trên nhiều cấu trúc máy khác nhau. (Xem bài 1 [13], bài 2 [14], bài 3 [15], bài 4 [16], bài 5 [17], bài 6 [18].)

Con sâu Code-Red [19] (và biến thể Code-Red 2 [20]) xuất hiện khoảng tháng 7 năm 2001 đã tận dụng một lỗi tràn bộ đệm trong dịch vụ đánh chỉ số (indexing service) của Microsoft IIS server. Con sâu Nimda [21], xuất hiện chừng một tuần sau sự kiện 9/11 đã tận dụng vài kẽ hở của hệ thống, trong đó có cổng sau (backdoor) do Code-Red để lại.

Gần đây hơn, con sâu W32/Blaster [22] và các biến thể của nó, xuất hiện cỡ tháng 7 năm 2003, gây thiệt hại lớn cho người dùng, cũng đã tận dụng một lỗi tràn bộ đệm trong một bộ phận gọi thủ tục từ xa (remote procedure call [23] – RPC) của Windows. Trên thực tế, nếu kẻ phá họai là lập trình viên tốt hơn thì tai họa đã không dừng ở con số 120 nghìn máy tính bị nhiễm sau 24 giờ.

Tại hội nghị bảo mật mũ đen (black hat security conference [24]) ở Las Vegas ngày 27 tháng 7 năm 2005, Michael Lynn (một nhân viên cũ của công ty Internet Security Systems) trình bày một phương thức tấn công các routers của Cisco chạy hệ điều hành Internetwork (IOS). Bài báo cáo của anh có tên gọi: “Cisco IOS Security Architecture”. Lỗi chính của IOS vẫn là một lỗi tràn bộ đệm kinh điển [25](cả stack lẫn heap). Nếu bọn phá phách dùng phương pháp này thì có thể nói không ngoa là đa phần Internet sẽ chết ngoẻo củ tỏi. Cisco tìm cách kiện ngay Michael, và cuối cùng Michael và hội nghị này đồng ý không phát tán [26] rộng rãi bài trình bày của Michael và bỏ nó ra khỏi proceedings của hội nghị. Trong thời gian đó, dĩ nhiên Cisco sẽ cố hết sức lấp lỗ hổng này càng nhanh càng tốt.

Đến đây thì có lẽ các bạn đã hiểu tại sao khẳng định buffer overflow bug = Y2K bug là có lý. (Y2K hay năm 2000 thường được dùng với ý nghĩa là bug của thế kỷ, nhưng cái Y2K bug mà người ta hay nói thì tôi cho rằng ngành công nghệ máy tính đã thổi phồng quá đáng để kiếm lợi.)


Article printed from Blog Khoa Học Máy Tính: http://www.procul.org/blog

URL to article: http://www.procul.org/blog/2005/02/07/l%e1%bb%97i-tran-b%e1%bb%99-o%e1%bb%87m/

URLs in this post:

[1] khuyến cáo bảo mật của CERT: http://www.cert.org/advisories/

[2] SecuriTeam: http://www.securiteam.com/

[3] Security Focus: http://www.securityfocus.com/

[4] @stake: http://http//www.atstake.com/index.html

[5] BugTraq mailing list: http://http//www.securityfocus.com/archive/1

[6] ở đây: http://http//www.ee.oulu.fi/research/ouspg/protos/sota/EICAR2000-overflow-survey/

[7] Robert Tappan Morris: http://www.pdos.lcs.mit.edu/%7Ertm/

[8] con sâu: http://redvip.homelinux.net/varios/morris_worm/GAO-rpt.txt

[9] national security agency: http://www.nsa.gov/

[10] phá stack cho vui và kiếm lợi: http://www.phrack.org/phrack/49/P49-14

[11] tạp chí Phrack: http://www.phrack.org/

[12] Cantor: http://www-groups.dcs.st-and.ac.uk/%7Ehistory/Mathematicians/Cantor.html

[13] bài 1: http://www.wntrmute.com/docs/hack/understanding%20buffer%20overflow%20exploits.htm

[14] bài 2: http://www.w00w00.org/files/articles/heaptut.txt

[15] bài 3: http://www.atstake.com/research/reports/wprasbuf.html

[16] bài 4: http://www.cultdeadcow.com/cDc_files/cDc-351/

[17] bài 5: http://www.phrack.org/phrack/55/P55-15

[18] bài 6: http://www.phrack.org/phrack/55/P55-08

[19] Code-Red: http://www.cert.org/advisories/CA-2001-19.html

[20] Code-Red 2: http://www.caida.org/analysis/security/code-red/coderedv2_analysis.xml

[21] Nimda: http://www.cert.org/advisories/CA-2001-26.html

[22] W32/Blaster: http://www.cert.org/advisories/CA-2003-20.html

[23] remote procedure call: http://www.sei.cmu.edu/str/descriptions/rpc.html

[24] black hat security conference: http://www.blackhat.com/html/bh-usa-05/bh-usa-05-index.html

[25] lỗi tràn bộ đệm kinh điển : http://nqh.blogspot.com/2005/02/li-trn-b-m.html

[26] đồng ý không phát tán: http://news.com.com/Flaw+researcher+settles+dispute+with+Cisco/2100-1002_3-5809390.html?tag=cd.top