Tuesday, March 15, 2005

Lỗi tràn bộ đệm

 

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 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, Security Focus, @stake, hoặc BugTraq mailing list để thấy các ví dụ về các cảnh báo này. Bài viết ở đây 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 (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 (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 (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 " của Aleph One năm 1996 trong tạp chí Phrack, 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 - 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, bài 2, bài 3, bài 4 , bài 5, bài 6.)

Con sâu Code-Red (và biến thể Code-Red 2) 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, 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 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 - 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ờ.

Đế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.)