This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Bạn có thể viết một đoạn code có khả năng bị tấn công sau đó minh họa cách mà hacker lợi dụng lỗ hổng đó không?

Business

Rìu Bạc Đôi
Để tránh vẽ đường cho bọn đần chạy, tôi sẽ chỉ đưa ra một ví dụ cũ kỹ lỗi thời mà thôi.

Nó minh họa một vài trường hợp lỗi có thể gặp phải - nhưng hi vọng là, chỉ có ít chương trình vẫn còn dính lỗi này mà thôi.

Trong ngôn ngữ C, có một hàm với tên gọi “gets” để đọc một dòng ký tự ASCII từ một luồng đầu vào nào đó:

1. char *gets( char *buffer) ;

Nếu bạn chạy đoạn mã này, nó sẽ đọc dữ liệu vào (tức là những thứ được gõ vào từ bàn phím) vào bộ đệm cho tới khi đọc được một ký tự “hoàn tất” (trans - thường là “enter”).

Vì thế có thể sẽ có một vài lập trình viên yếu kém viết thế này:

Mã:
1. bool checkPassword ()

2. {

3. char buffer [ 100 ] ;

4. int hasPermission = 0 ;

5.

6. printf ( "Please enter your password: " ) ;

7. gets(buffer) ;

8.

9. if ( strcmp ( buffer, "wybbl3" ) == 0 )

10. hasPermission = true ;

11. else

12. printf ( "Incorrect Password!\n" ) ;

13.

14. return hasPermission ;

15. }

(Giờ đây thì, các lập trình viên “đích thực” ấy đang mơ hồ hồi tưởng lại và có cảm giác thốn không hề nhẹ!)

Và - hàm “checkPassword()” đặt “hasPermission” thành 0 (không được phép) - rồi sau đó nó sẽ yêu cầu bạn nhập mật khẩu vào - và nếu mật khẩu đó là “wybbl3” thì nó sẽ chuyển “hasPermission” thành ‘1’ (được cấp quyền) - còn không, nó sẽ hiện dòng chữ “Incorrect Password!” và trả về ‘0’ - tức là “false”.

Đối với những mật khẩu “thông thường”, hàm này sẽ hoạt động được. Bất cứ ai kiểm tra đoạn mã này có lẽ sẽ thử gõ một vài mật khẩu sai rồi sau đó là mật khẩu đúng, có thể sẽ gõ Enter mà không có ký tự nào - và có vẻ như mọi thứ đều hoạt động trơn tru, vì thế đoạn này sẽ được đưa vào code của sản phẩm.

NHƯNG nếu luồng đầu vào lại có trên 100 ký tự (thực sự thì là 99) - nó sẽ cần nhiều không gian hơn so với những gì có trong “buffer”.

Trong C thì, chẳng có cách nào để hàm này có thể biết không gian có trong một mảng là bao nhiêu, vì thế nếu có quá nhiều dữ liệu, thì, liệu chuyện gì sẽ xảy ra?

Chà, ở ví dụ trên, “buffer” là một biến địa phương, nên nó được lưu trữ trên stack... và biến “hasPermission” cũng thế.

Vì thế NẾU một kẻ ma quái nào đó muốn hack máy tính của bạn, tất cả những gì mà họ phải làm là gõ trên 100 ký tự vào máy tính khi có màn hình nhắc mật khẩu xuất hiện!

Mảng buffer không có đủ không gian dành cho (tạm cho là) 101 ký tự - nên ký tự thứ 101 sẽ vô tình được ấn vào không gian bộ nhớ tiếp theo - đó là byte đầu tiên dành cho biến “hasPermission”!

Giờ đây, hàm so sánh xâu không chạy được vì gã kia không biết mật khẩu - nhưng lại chẳng hề quan trọng chút nào bởi biến “hasPermission” giờ đây chứa một ký tự khác không từ byte thứ 101 mà gã kia gõ vào.

Có nghĩa là hàm “checkPassword” trả về giá trị “true” ngay cả khi hắn không biết được mật khẩu!

CHÚC MỪNG! BẠN ĐÃ BỊ HACK!

Cách này được gọi là “khai thác tràn bộ đệm” và nó vẫn là một cách phổ biến để đột nhập vào các đoạn mã.

Nếu họ có thể truy cập vào mã nguồn chương trình của bạn - họ sẽ nhìn vào những tình huống như thế này và khai thác các lỗ hổng một cách dễ dàng - nhưng ngay cả khi họ không có mã nguồn, họ sẽ vẫn chạy chương trình đưa những thứ rác rưởi linh tinh cho tới khi nó hoạt động sai lầm theo cách nào đó... Sau đó họ sẽ tìm xem code bị hổng chỗ nào và thử lại với một vài input có tính toán để xem xem dạng dữ liệu nào sẽ bẻ gãy được nó và bằng cách nào.

Hướng dẫn sử dụng thư viện C chuẩn giờ đã gắn cờ hàm “gets” là “deprecated” (lỗi thời) vì lý do này.

https://linux.die.net/man/3/gets

Nó nói rằng “Không bao giờ sử dụng hàm gets()”. …Và thực sự là chuẩn 100% luôn!

Cách khai thác lỗi tràn bộ đệm có thể tinh vi hơn nhiều, và thường họ có thể viết mã máy đưa vào trong stack và thực thi nó, việc này cho phép thực hiện những khai thác còn tinh quái hơn NHIỀU.

Link gốc: https://www.quora.com/Can-you-write...doUdMNtEK3Nxbb-2bUJcV46s7Cafr3NGWzWWSn7_t9DP0
Steve Baker, Blogger LetsRunWithIt.com (2013-nay)
Dịch Nhóm Quora VN.
 

Cloud

Administrator
Có ai hiểu gì không chứ đọc xong thấy không hiểu lắm