✨Lỗi tràn bộ nhớ đệm

Lỗi tràn bộ nhớ đệm

Trong các lĩnh vực an ninh máy tính và lập trình, một lỗi tràn bộ nhớ đệm hay gọi tắt là lỗi tràn bộ đệm (tiếng Anh: buffer overflow) là một lỗi lập trình có thể gây ra một ngoại lệ truy nhập bộ nhớ máy tính và chương trình bị kết thúc, hoặc khi người dùng có ý phá hoại, họ có thể lợi dụng lỗi này để phá vỡ an ninh hệ thống.

Lỗi tràn bộ đệm là một điều kiện bất thường khi một tiến trình lưu dữ liệu vượt ra ngoài biên của một bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu đó sẽ đè lên các vị trí bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển luồng chạy của chương trình (program flow control).

Các lỗi tràn bộ đệm có thể làm cho một tiến trình đổ vỡ hoặc cho ra các kết quả sai. Các lỗi này có thể được kích hoạt bởi các dữ liệu vào được thiết kế đặc biệt để thực thi các đoạn mã phá hoại hoặc để làm cho chương trình hoạt động một cách không như mong đợi. Bằng cách đó, các lỗi tràn bộ đệm gây ra nhiều lỗ hổng bảo mật (vulnerability) đối với phần mềm và tạo cơ sở cho nhiều thủ thuật khai thác (exploit). Việc kiểm tra biên (bounds checking) đầy đủ bởi lập trình viên hoặc trình biên dịch có thể ngăn chặn các lỗi tràn bộ đệm.

Mô tả kỹ thuật

Một lỗi tràn bộ nhớ đệm xảy ra khi dữ liệu được viết vào một bộ nhớ đệm, mà do không kiểm tra biên đầy đủ nên đã ghi đè lên vùng bộ nhớ liền kề và làm hỏng các giá trị dữ liệu tại các địa chỉ bộ nhớ kề với vùng bộ nhớ đệm đó. Hiện tượng này hay xảy ra nhất khi sao chép một xâu ký tự từ một bộ nhớ đệm này sang một vùng bộ nhớ đệm khác.

Ví dụ cơ bản

Trong ví dụ sau, một chương trình đã định nghĩa hai phần tử dữ liệu kề nhau trong bộ nhớ: A là một bộ nhớ đệm xâu ký tự dài 8 byte, và B là một số nguyên kích thước 2 byte. Ban đầu, A chỉ chứa toàn các byte giá trị 0, còn B chứa giá trị 3. Các ký tự có kích thước 1 byte.

Bây giờ, chương trình ghi một xâu ký tự "excessive" vào bộ đệm A, theo sau là một byte 0 để đánh dấu kết thúc xâu. Vì không kiểm tra độ dài xâu, nên xâu ký tự mới đã đè lên giá trị của B:

Tuy lập trình viên không có ý định sửa đổi B, nhưng giá trị của B đã bị thay thế bởi một số được tạo nên từ phần cuối của xâu ký tự. Trong ví dụ này, trên một hệ thống big-endian sử dụng mã ASCII, ký tự "e" và tiếp theo là một byte 0 sẽ trở thành số 25856.

Nếu B là phần tử dữ liệu duy nhất còn lại trong số các biến được chương trình định nghĩa, việc viết một xâu ký tự dài hơn nữa và vượt quá phần cuối của B sẽ có thể gây ra một lỗi chẳng hạn như segmentation fault (lỗi phân đoạn) và tiến trình sẽ kết thúc.

Tràn bộ nhớ đệm trên stack

Bên cạnh việc sửa đổi các biến không liên quan, hiện tượng tràn bộ đệm còn thường bị lợi dụng (khai thác) bởi tin tặc để làm cho một chương trình đang chạy thực thi một đoạn mã tùy ý được cung cấp. Các kỹ thuật để một tin tặc chiếm quyền điều khiển một tiến trình tùy theo vùng bộ nhớ mà bộ đệm được đặt tại đó. Ví dụ, vùng bộ nhớ stack, nơi dữ liệu có thể được tạm thời "đẩy" xuống "đỉnh" ngăn xếp (push), và sau đó được "nhấc ra" (pop) để đọc giá trị của biến. Thông thường, khi một hàm (function) bắt đầu thực thi, các phần tử dữ liệu tạm thời (các biến địa phương) được đẩy vào, và chương trình có thể truy nhập đến các dữ liệu này trong suốt thời gian chạy hàm đó. Không chỉ có hiện tượng tràn stack (stack overflow) mà còn có cả tràn heap (heap overflow).

Trong ví dụ sau, "X" là dữ liệu đã từng nằm tại stack khi chương trình bắt đầu thực thi; sau đó chương trình gọi hàm "Y", hàm này đòi hỏi một lượng nhỏ bộ nhớ cho riêng mình; và sau đó "Y" gọi hàm "Z", "Z" đòi hỏi một bộ nhớ đệm lớn:

Nếu hàm "Z" gây tràn bộ nhớ đệm, nó có thể ghi đè dữ liệu thuộc về hàm Y hay chương trình chính:

Điều này đặc biệt nghiêm trọng đối với hầu hết các hệ thống. Ngoài các dữ liệu thường, bộ nhớ stack còn lưu giữ địa chỉ trả về, nghĩa là vị trí của phần chương trình đang chạy trước khi hàm hiện tại được gọi. Khi hàm kết thúc, vùng bộ nhớ tạm thời sẽ được lấy ra khỏi stack, và thực thi được trao lại cho địa chỉ trả về. Như vậy, nếu địa chỉ trả về đã bị ghi đè bởi một lỗi tràn bộ đệm, nó sẽ trỏ tới một vị trí nào đó khác. Trong trường hợp một hiện tượng tràn bộ đệm không có chủ ý như trong ví dụ đầu tiên, hầu như chắc chắn rằng vị trí đó sẽ là một vị trí không hợp lệ, không chứa một lệnh nào của chương trình, và tiến trình sẽ đổ vỡ. Tuy nhiên, một kẻ tấn công có thể chỉnh địa chỉ trả về để trỏ tới một vị trí tùy ý sao cho nó có thể làm tổn hại an ninh hệ thống.

Mã nguồn ví dụ

Mã nguồn C dưới đây thể hiện một lỗi lập trình thường gặp. Sau khi được biên dịch, chương trình sẽ tạo ra một lỗi tràn bộ đệm nếu nó được gọi với một tham số dòng lệnh là một xâu ký tự quá dài, vì tham số này được dùng để ghi vào một bộ nhớ đệm mà không kiểm tra độ dài của nó.

/* overflow.c - demonstrates a buffer overflow */

include <stdio.h>

include <string.h>

int main(int argc, char *argv[]) { char buffer[10]; if (argc < 2) { fprintf(stderr, "USAGE: %s string\n", argv[0]); return 1; } strcpy(buffer, argv[1]); return 0; }

Các xâu ký tự độ dài không quá 9 sẽ không gây tràn bộ đệm. Các xâu ký tự gồm từ 10 ký tự trở lên sẽ gây tràn bộ đệm: hiện tượng này luôn luôn là một lỗi sai nhưng không phải lúc nào cũng gây ra việc chương trình chạy sai hay gây lỗi segmentation fault.

Chương trình trên có thể được viết lại cho an toàn bằng cách sử dụng hàm strncpy như sau:

Khai thác lỗi tràn bộ đệm trên heap

Một hiện tượng tràn bộ đệm xảy ra trong khu vực dữ liệu heap được gọi là một hiện tượng tràn heap và có thể khai thác được bằng các kỹ thuật khác với các lỗi tràn stack. Bộ nhớ heap được cấp phát động bởi các ứng dụng tại thời gian chạy và thường chứa dữ liệu của chương trình. Việc khai thác được thực hiện bằng cách phá dữ liệu này theo các cách đặc biệt để làm cho ứng dụng ghi đè lên các cấu trúc dữ liệu nội bộ chẳng hạn các con trỏ của danh sách liên kết.

Lỗ hổng của Microsoft JPEG GDI+ là một ví dụ gần đây về sự nguy hiểm mà một lỗi tràn heap có thể dẫn đến.

Cản trở đối với các thủ thuật khai thác

Việc xử lý bộ đệm trước khi đọc hay thực thi nó có thể làm thất bại các cố gắng khai thác lỗi tràn bộ đệm. Các xử lý này có thể giảm bớt mối đe dọa của việc khai thác lỗi, nhưng có thể không ngăn chặn được một cách tuyệt đối. Việc xử lý có thể bao gồm: chuyển từ chữ hoa thành chữ thường, loại bỏ các ký tự đặc biệt (metacharacters) và lọc các xâu không chứa ký tự là chữ số hoặc chữ cái. Tuy nhiên, có các kỹ thuật để tránh việc lọc và xử lý này; alphanumeric code (mã gồm toàn chữ và số), polymorphic code (mã đa hình), Self-modifying code (mã tự sửa đổi) và tấn công kiểu return-to-libc. Cũng chính các phương pháp này có thể được dùng để tránh bị phát hiện bởi các hệ thống phát hiện thâm nhập (Intrusion detection system).

Chống tràn bộ đệm

Nhiều kỹ thuật đa dạng với nhiều ưu nhược điểm đã được sử dụng để phát hiện hoặc ngăn chặn hiện tượng tràn bộ đệm. Cách đáng tin cậy nhất để tránh hoặc ngăn chặn tràn bộ đệm là sử dụng bảo vệ tự động tại mức ngôn ngữ lập trình. Tuy nhiên, loại bảo vệ này không thể áp dụng cho mã thừa kế (legacy code), và nhiều khi các ràng buộc kỹ thuật, kinh doanh hay văn hóa lại đòi hỏi sử dụng một ngôn ngữ không an toàn. Các mục sau đây mô tả các lựa chọn và cài đặt hiện có.

Lựa chọn ngôn ngữ lập trình

Lựa chọn về ngôn ngữ lập trình có thể có một ảnh hưởng lớn đối với sự xuất hiện của lỗi tràn bộ đệm. Năm 2006, C và C++ nằm trong số các ngôn ngữ lập trình thông dụng nhất, với một lượng khổng lồ các phần mềm đã được viết bằng hai ngôn ngữ này. C và C++ không cung cấp sẵn các cơ chế chống lại việc truy nhập hoặc ghi đè dữ liệu lên bất cứ phần nào của bộ nhớ thông qua các con trỏ bất hợp lệ; cụ thể, hai ngôn ngữ này không kiểm tra xem dữ liệu được ghi vào một mảng (cài đặt của một bộ nhớ đệm) có nằm trong biên của mảng đó hay không. Tuy nhiên, cần lưu ý rằng các thư viện chuẩn của C++, thư viện khuôn mẫu chuẩn - STL, cung cấp nhiều cách an toàn để lưu trữ dữ liệu trong bộ đệm, và các lập trình viên C cũng có thể tạo và sử dụng các tiện ích tương tự. Cũng như đối với các tính năng bất kỳ khác của C hay C++, mỗi lập trình viên phải tự xác định lựa chọn xem họ có muốn chấp nhận các hạn chế về tốc độ chương trình để thu lại các lợi ích tiềm năng (độ an toàn của chương trình) hay không.

Một số biến thể của C, chẳng hạn Cyclone, giúp ngăn chặn hơn nữa các lỗi tràn bộ đệm bằng việc chẳng hạn như gắn thông tin về kích thước mảng với các mảng. Ngôn ngữ lập trình D sử dụng nhiều kỹ thuật đa dạng để tránh gần hết việc sử dụng con trỏ và kiểm tra biên do người dùng xác định.

Nhiều ngôn ngữ lập trình khác cung cấp việc kiểm tra tại thời gian chạy, việc kiểm tra này gửi một cảnh báo hoặc ngoại lệ khi C hoặc C++ ghi đè dữ liệu. Ví dụ về các ngôn ngữ này rất đa dạng, từ Python tới Ada, từ Lisp tới Modula-2, và từ Smalltalk tới OCaml. Các môi trường bytecode của Java và .NET cũng đòi hỏi kiểm tra biên đối với tất cả các mảng. Gần như tất cả các ngôn ngữ thông dịch sẽ bảo vệ chương trình trước các hiện tượng tràn bộ đệm bằng cách thông báo một trạng thái lỗi định rõ (well-defined error). Thông thường, khi một ngôn ngữ cung cấp đủ thông tin về kiểu để thực hiện kiểm tra biên, ngôn ngữ đó thường cho phép lựa chọn kích hoạt hay tắt chế độ đó. Việc phân tích tĩnh (static analysis) có thể loại được nhiều kiểm tra kiểu và biên động, nhưng các cài đặt tồi và các trường hợp rối rắm có thể giảm đáng kể hiệu năng. Các kỹ sư phần mềm phải cẩn thận cân nhắc giữa các phí tổn cho an toàn và hiệu năng khi quyết định sẽ sử dụng ngôn ngữ nào và cấu hình như thế nào cho trình biên dịch.

Sử dụng các thư viện an toàn

Vấn đề tràn bộ đệm thường gặp trong C và C++ vì các ngôn ngữ này để lộ các chi tiết biểu diễn mức thấp của các bộ nhớ đệm với vai trò các chỗ chứa cho các kiểu dữ liệu. Do đó, phải tránh tràn bộ đệm bằng cách gìn giữ tính đúng đắn cao cho các phần mã chương trình thực hiện việc quản lý bộ đệm. Việc sử dụng các thư viện được viết tốt và đã được kiểm thử, dành cho các kiểu dữ liệu trừu tượng mà các thư viện này thực hiện tự động việc quản lý bộ nhớ, trong đó có kiểm tra biên, có thể làm giảm sự xuất hiện và ảnh hưởng của các hiện tượng tràn bộ đệm. Trong các ngôn ngữ này, xâu ký tự và mảng là hai kiểu dữ liệu chính mà tại đó các hiện tượng tràn bộ đệm thường xảy ra; do đó, các thư viện ngăn chặn lỗi tràn bộ đệm tại các kiểu dữ liệu này có thể cung cấp phần chính của sự che chắn cần thiết. Dù vậy, việc sử dụng các thư viện an toàn một cách không đúng có thể dẫn đến tràn bộ đệm và một số lỗ hổng khác; và tất nhiên, một lỗi bất kỳ trong chính thư viện chính nó cũng là một lỗ hổng. Các cài đặt thư viện "an toàn" gồm [http://bstring.sf.net/ The Better String Library], [http://arri.berlios.de/ Arri Buffer API] và [http://www.and.org/vstr/ Vstr]. Thư viện C của hệ điều hành OpenBSD cung cấp các hàm hữu ích strlcpy strlcat, nhưng các hàm này nhiều hạn chế hơn nhiều so với các cài đặt thư viện an toàn đầy đủ.

Tháng 9 năm 2006, Báo cáo kỹ thuật số 24731 của hội đồng tiêu chuẩn C đã được công bố; báo cáo này mô tả một tập các hàm mới dựa trên các hàm vào ra dữ liệu và các hàm xử lý xâu ký tự của thư viện C chuẩn, các hàm mới này được bổ sung các tham số về kích thước bộ đệm.

Chống tràn bộ nhớ đệm trên stack

Stack-smashing protection là kỹ thuật được dùng để phát hiện các hiện tượng tràn bộ đệm phổ biến nhất. Kỹ thuật này kiểm tra xem stack đã bị sửa đổi hay chưa khi một hàm trả về. Nếu stack đã bị sửa đổi, chương trình kết thúc bằng một lỗi segmentation fault. Các hệ thống sử dụng kỹ thuật này gồm có Libsafe, StackGuard và các bản vá lỗi (patch) ProPolice'' gcc.

Chế độ Data Execution Prevention (cấm thực thi dữ liệu) của Microsoft bảo vệ thẳng các con trỏ tới SEH Exception Handler, không cho chúng bị ghi đè.

Có thể bảo vệ stack hơn nữa bằng cách phân tách stack thành hai phần, một phần dành cho dữ liệu và một phần cho các bước trả về của hàm. Sự phân chia này được dùng trong ngôn ngữ lập trình Forth, tuy nó không phải một quyết định thiết kế dựa theo tiêu chí an toàn. Nhưng dù sao thì đây cũng không phải một giải pháp hoàn chỉnh đối với vấn đề tràn bộ đệm, khi các dữ liệu nhạy cảm không phải địa chỉ trả về vẫn có thể bị ghi đè.

Bảo vệ không gian thực thi

Bảo vệ không gian thực thi là một cách tiếp cận đối với việc chống tràn bộ đệm. Kỹ thuật này ngăn chặn việc thực thi mã tại stack hay heap. Một kẻ tấn công có thể sử dụng tràn bộ đệm để chèn một đoạn mã tùy ý vào bộ nhớ của một chương trình, nhưng với bảo vệ không gian thực thi, mọi cố gắng chạy đoạn mã đó sẽ gây ra một ngoại lệ (exception).

Một số CPU hỗ trợ một tính năng có tên bit NX ("No eXecute" - "Không thực thi") hoặc bit XD ("eXecute Disabled" - "chế độ thực thi đã bị tắt"). Khi kết hợp với phần mềm, các tính năng này có thể được dùng để đánh dấu các trang dữ liệu (chẳng hạn các trang chứa stack và heap) là đọc được nhưng không thực thi được.

Một số hệ điều hành Unix (chẳng hạn OpenBSD, Mac OS X) có kèm theo tính năng bảo vệ không gian thực thi (ví dụ W^X). Một số gói phần mềm tùy chọn bao gồm:

  • PaX
  • Exec Shield
  • Openwall

Các biến thể mới của Microsoft Windows cũng hỗ trợ bảo vệ không gian thực thi, với tên gọi Data Execution Prevention (ngăn chặn thực thi dữ liệu). Các phần mềm gắn kèm (Add-on) bao gồm:

  • SecureStack
  • OverflowGuard
  • BufferShield
  • StackDefender

Phương pháp bảo vệ không gian thực thi không chống lại được tấn công return-to-libc.

Ngẫu nhiên hóa sơ đồ không gian địa chỉ

Ngẫu nhiên hóa sơ đồ không gian địa chỉ (Address space layout randomization - ASLR) là một tính năng an ninh máy tính có liên quan đến việc sắp xếp vị trí các vùng dữ liệu quan trọng (thường bao gồm nơi chứa mã thực thi và vị trí các thư viện, heap và stack) một cách ngẫu nhiên trong không gian địa chỉ của một tiến trình.

Việc ngẫu nhiên hóa các địa chỉ bộ nhớ ảo mà các hàm và biến nằm tại đó làm cho việc khai thác một lỗi tràn bộ đệm trở nên khó khăn hơn, nhưng không phải là không thể được. Nó còn buộc kẻ tấn công phải điều chỉnh khai thác cho hợp với từng hệ thống cụ thể, điều này làm thất bại cố gắng của các con sâu Internet. Một phương pháp tương tự nhưng kém hiệu quả hơn, đó là kỹ thuật rebase đối với các tiến trình và thư viện trong không gian địa chỉ ảo.

Kiểm tra sâu đối với gói tin

Biện pháp kiểm tra sâu đối với gói tin (deep packet inspection - DPI) có thể phát hiện các cố gắng từ xa để khai thác lỗi tràn bộ đệm ngay từ biên giới mạng. Các kỹ thuật này có khả năng chặn các gói tin có chứa chữ ký của một vụ tấn công đã biết hoặc chứa một chuỗi dài các lệnh No-Operation (NOP - lệnh rỗng không làm gì), các chuỗi như vậy thường được sử dụng khi vị trí của nội dung quan trọng (payload) của tấn công hơi có biến đổi.

Việc rà các gói tin không phải là một phương pháp hiệu quả vì nó chỉ có thể ngăn chặn các tấn công đã biết, và có nhiều cách để mã hóa một lệnh NOP. Các kẻ tấn công có thể đã sử dụng mã alphanumeric, metamorphic, và shellcode tự sửa để tránh bị phát hiện bởi việc rà gói tin.

Biện pháp phòng ngừa ở cấp độ người dùng

Bên cạnh các kỹ thuật bảo vệ ở cấp độ hệ thống và lập trình, hành vi và thói quen của người dùng cuối đóng vai trò quan trọng trong việc ngăn ngừa các cuộc tấn công khai thác lỗi tràn bộ đệm, cũng như giảm thiểu tác động của chúng nếu xảy ra. Một số biện pháp phòng ngừa cơ bản nhưng thiết yếu có thể kể đến như sau:

Khởi động lại thiết bị định kỳ Tràn bộ đệm thường được các tác nhân độc hại lợi dụng để duy trì quyền kiểm soát tạm thời trong bộ nhớ khả biến (RAM) mà không ghi dấu trực tiếp lên hệ thống lưu trữ lâu dài. Bằng cách thực hiện khởi động lại thiết bị định kỳ, người dùng có thể:

Xóa bỏ toàn bộ trạng thái bộ nhớ tạm thời, loại trừ sự hiện diện của các mã độc đang chạy trong bộ nhớ.

Ngăn chặn sự tiếp tục hoạt động của các tiến trình không xác định hoặc trái phép đã khai thác lỗ hổng tràn bộ đệm.

Hạn chế các lây lan thứ cấp, khi mã khai thác cố gắng tiếp tục di chuyển trong hệ thống hoặc sang các thiết bị khác.

Đặc biệt, trong môi trường có mức độ nhạy cảm cao (chẳng hạn hệ thống thông tin tài chính, quân sự), việc lên lịch tự động khởi động lại hệ thống sau một khoảng thời gian hoạt động liên tục có thể được xem là một yêu cầu bảo mật bắt buộc.

Duy trì cập nhật phần mềm và hệ điều hành Lỗi tràn bộ đệm được xem là một trong những loại lỗ hổng bảo mật phổ biến nhất và thường xuyên bị khai thác. Các nhà phát triển hệ điều hành, ứng dụng và thư viện phần mềm định kỳ phát hành các bản vá nhằm:

Sửa chữa các điểm yếu liên quan tới tràn bộ đệm trong mã nguồn.

Gia tăng cơ chế kiểm soát biên hoặc các kiểm tra tại thời gian chạy.

Tích hợp các biện pháp bảo vệ bổ sung như ASLR hoặc DEP.

Người dùng cần thiết lập hệ thống cập nhật tự động hoặc chủ động kiểm tra cập nhật, đặc biệt đối với các phần mềm nền tảng như trình duyệt, bộ thư viện hệ thống, các dịch vụ mạng hoặc ứng dụng có khả năng nhận dữ liệu từ bên ngoài. Việc chậm trễ trong cập nhật tạo ra một khoảng trống an ninh mà các khai thác đã được công bố rộng rãi có thể tận dụng.

Khôi phục hoặc cài đặt lại hệ thống khi cần thiết Khi xuất hiện các dấu hiệu bất thường như:

Hiệu suất hệ thống suy giảm không rõ nguyên nhân.

Các tiến trình lạ hoạt động trong nền.

Cài đặt hệ thống tự ý thay đổi hoặc xuất hiện các kết nối mạng khả nghi.

Người dùng cần cân nhắc việc khôi phục hệ thống về trạng thái trước đó thông qua các bản sao lưu tin cậy, hoặc trong các trường hợp nghiêm trọng hơn, tiến hành cài đặt lại toàn bộ hệ điều hành. Các thao tác này nhằm:

Xóa bỏ hoàn toàn các phần mềm độc hại tiềm ẩn đã khai thác bộ nhớ.

Khôi phục trạng thái hệ thống về mức độ toàn vẹn cao nhất có thể.

Ngăn chặn các cuộc tấn công tiếp theo tận dụng quyền truy cập đã có.

Việc cài đặt lại cần đi kèm với quy trình thiết lập hệ thống bảo mật đúng chuẩn, bao gồm áp dụng ngay lập tức các bản vá mới nhất và thiết lập các công cụ phòng vệ thích hợp.

Triển khai và duy trì phần mềm bảo mật Phần mềm chống mã độc hiện đại không chỉ dựa vào cơ sở dữ liệu chữ ký tĩnh mà còn áp dụng:

Công nghệ phân tích hành vi (behavioral analysis) để nhận diện hoạt động khai thác bộ nhớ bất thường.

Phát hiện các mẫu hành vi tràn bộ đệm như chuỗi lệnh NOP dài bất thường, hoặc nỗ lực ghi đè các vùng bộ nhớ bảo vệ.

Quản lý tường lửa cá nhân nhằm giới hạn lưu lượng dữ liệu đầu vào, ngăn chặn các gói tin chứa mã khai thác trước khi chúng xâm nhập vào hệ thống.

Việc duy trì cập nhật định kỳ cơ sở dữ liệu chữ ký và phần mềm bảo mật là yếu tố bắt buộc để đảm bảo khả năng phát hiện và phản ứng kịp thời với các mối đe dọa mới.

Quản lý an toàn nguồn dữ liệu đầu vào Rất nhiều vụ tấn công tràn bộ đệm bắt đầu từ việc người dùng mở tệp tin, ứng dụng hoặc nhấn vào các liên kết không rõ nguồn gốc. Vì vậy, cần áp dụng các nguyên tắc:

Chỉ tải xuống phần mềm và tài liệu từ các nguồn chính thức và có uy tín.

Không mở tệp đính kèm email từ người gửi không xác định, hoặc từ các email có dấu hiệu khả nghi.

Sử dụng công cụ kiểm tra và phân tích tệp tin trước khi mở.

Các phương thức xã hội (social engineering) ngày càng tinh vi nhằm đánh lừa người dùng, do đó, việc nâng cao nhận thức và thực hành kiểm soát đầu vào là tuyến phòng thủ đầu tiên chống lại nhiều dạng khai thác, bao gồm tràn bộ đệm.

Sao lưu dữ liệu định kỳ Trong tình huống xấu nhất, khi một cuộc tấn công thành công gây hỏng hóc hệ thống, sao lưu dữ liệu đầy đủ và định kỳ giúp:

Giảm thiểu thiệt hại về tài sản thông tin.

Đẩy nhanh quá trình phục hồi sau sự cố.

Tránh phải trả tiền chuộc hoặc chấp nhận mất dữ liệu nếu bị tấn công bằng mã độc khai thác lỗi bộ nhớ.

Việc sao lưu nên tuân thủ nguyên tắc 3-2-1: ba bản sao, trên hai loại phương tiện lưu trữ khác nhau, và một bản sao lưu ngoại tuyến hoặc ngoại vi (offsite).

Đánh giá tổng quan Mặc dù các biện pháp ở cấp độ người dùng không thể thay thế hoàn toàn các giải pháp kỹ thuật chuyên sâu, chúng đóng vai trò bổ trợ quan trọng trong mô hình bảo vệ nhiều lớp chống lại các khai thác tràn bộ đệm. Một chiến lược an ninh mạng hiệu quả đòi hỏi sự phối hợp đồng bộ giữa:

Các biện pháp kỹ thuật (như ASLR, DEP, kiểm tra sâu gói tin).

Thực hành an toàn ở cấp độ người dùng cuối.

Chỉ với sự hợp tác chặt chẽ giữa hai cấp độ này, một môi trường vận hành an toàn trước nguy cơ tràn bộ đệm mới có thể được đảm bảo.

Lịch sử khai thác

Khai thác lỗi tràn bộ đệm được biết đến đầu tiên là vào năm 1988. Đó là một trong các khai thác mà sâu Morris sử dụng để lan truyền chính mình trên Internet. Chương trình đã bị khai thác là một dịch vụ Unix có tên fingerd.

Sau đó, vào năm 1995, Thomas Lopatic đã tái phát hiện hiện tượng tràn bộ đệm một cách độc lập và công bố phát kiến của mình trên danh sách thư an ninh Bugtraq. Một năm sau, 1996, Elias Levy (còn gọi là Aleph One) công bố trên tạp chí Phrack bài báo "Smashing the Stack for Fun and Profit" (Phá bộ nhớ stack cho vui và để thu lợi),, đây là một hướng dẫn từng bước cho việc khai thác các lỗ hổng tràn bộ đệm trên stack.

Từ đó, ít nhất hai con sâu Internet đã khai thác lỗi tràn bộ đệm để xâm phạm hàng loạt hệ thống lớn. Năm 2001, Sâu Code Red khai thác lỗi tràn bộ đệm trong chương trình Internet Information Services (IIS) 5.0 của Microsoft, và vào năm 2003, sâu SQLSlammer đã phá hoại các máy chạy Microsoft SQL Server 2000.

👁️ 1 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong các lĩnh vực an ninh máy tính và lập trình, một **lỗi tràn bộ nhớ đệm** hay gọi tắt là **lỗi tràn bộ đệm** (tiếng Anh: _buffer overflow_) là một lỗi lập trình có
Trong phần mềm, **tràn bộ đệm ở ngăn xếp** (tiếng Anh: _stack buffer overflow_ hay _stack buffer overrun_) xảy ra khi một chương trình viết địa chỉ bộ nhớ lên vùng gọi ngăn xếp của
Trong lập trình, **lỗi tràn ngăn xếp** xảy ra nếu các con trỏ ngăn xếp vượt quá giới hạn của ngăn xếp. Ngăn xếp có thể bao gồm một lượng hữu hạn các địa chỉ
**Trận Bô Cô** hay **Bồ Cô** diễn ra vào ngày 30 tháng 12 năm 1408 (tức 14 tháng 12 năm Mậu Tý) tại bến Bô Cô bên sông Đáy, thuộc tỉnh Nam Định ngày nay.
**Trận Iwo Jima** (, , 19 tháng 2 — 26 tháng 3 năm 1945) là trận đánh lớn thuộc mặt trận Thái Bình Dương trong Chiến tranh thế giới thứ hai giữa Hoa Kỳ và
**Trận Hà Nội đông xuân 1946-47** là sự kiện khởi động Chiến tranh Đông Dương giữa các lực lượng Việt Nam Dân chủ Cộng hòa (Việt Minh) và tập đoàn quân viễn chinh Pháp từ
**Nhà Trần** (chữ Nôm: 茹陳, chữ Hán: 陳朝, Hán Việt: _Trần triều_) là một triều đại quân chủ cai trị nước Đại Việt từ năm 1226 đến năm 1400. Đây là triều đại được lưu
**Trận chiến Đại Tây Dương** được xem là trận chiến kéo dài nhất trong lịch sử Chiến tranh thế giới thứ hai mặc dù có nhiều nhà sử học, nhà nghiên cứu hải quân của
**Trận chiến đồi Edson**, hay còn gọi là **Trận chiến Đồi Máu**, là một trận đánh trên bộ trong Chiến dịch Guadalcanal thuộc Mặt trận Thái Bình Dương trong Chiến tranh thế giới thứ hai
**Mặt trận Srem** (, ) là tuyến phòng thủ vững chắc của Wehrmacht và Quân lực Croatia nằm tại Srem và Đông Slavonia trong Thế chiến thứ hai từ 23 tháng 10 năm 1944 đến
**Trận vòng cung Kursk** (lịch sử Nga gọi là **_Chiến dịch phòng ngự - phản công Kursk_**) là một trong những chiến dịch lớn nhất trên chiến trường Xô-Đức trong Chiến tranh thế giới thứ
**Trận Midway** là một trận hải chiến quan trọng trong thế chiến thứ hai tại chiến trường Thái Bình Dương, diễn ra ngày từ ngày 4 tháng 6 – 7 tháng 6 năm 1942. Hai
**Trần Thu Hà** (sinh ngày 26 tháng 8 năm 1977), còn được biết đến với nghệ danh **Hà Trần**, là một nữ ca sĩ kiêm nhà sản xuất nhạc người Việt Nam. Nổi tiếng với
**Trần Minh Tông** (chữ Hán: 陳明宗 4 tháng 10 năm 1300 – 10 tháng 3 năm 1357) tên thật là **Trần Mạnh** (陳奣), là vị hoàng đế thứ năm của Hoàng triều Trần nước Đại
**Trận Okinawa** (tiếng Anh: Battle of Okinawa, tiếng Nhật: 沖縄戦, Okinawa-sen), hay còn gọi là **chiến dịch Iceberg** (**chiến dịch Băng Sơn**) là trận đánh thuộc mặt trận Thái Bình Dương trong Chiến tranh thế
**Trận Hồng Cúm**, từ ngày 31 tháng 3 đến 7 tháng 5 năm 1954, là trận đánh quan trọng của chiến dịch Điện Biên Phủ. Mục tiêu của Quân đội Nhân dân Việt Nam trong
**Trận Kasserine** là một chuỗi trận đánh trong Chiến dịch Tunisia thời Chiến tranh thế giới thứ hai, diễn ra từ ngày 19 cho đến ngày 22 tháng 2 năm 1943 quanh đèo Kasserine –
**Trận Stalingrad** (23 tháng 8 năm 19422 tháng 2 năm 1943) là một trận đánh lớn diễn ra trong Chiến tranh Xô-Đức giữa Đức Quốc xã cùng với các nước thuộc địa và Hồng quân
**Trận Poltava** (, ), còn gọi là **Trận đánh Pultowa**, là trận đánh lớn diễn ra vào ngày 27 tháng 6 năm 1709 theo lịch Julius giữa hai đoàn quân hùng hậu: Quân đội Nga
**Trận Leyte** trong chiến dịch Thái Bình Dương, Chiến tranh thế giới thứ hai là một cuộc đổ bộ và chiến đấu giành sự kiểm soát Leyte thuộc quần đảo Philippines bởi lực lượng Mỹ
**Trận Agincourt** (; ) là một trận đánh tiêu biểu trong chiến tranh Trăm Năm giữa Anh với Pháp. Trận đánh diễn ra ngày 25 tháng 10 năm 1415 (Ngày Thánh Crispin) gần Azincourt, ở
**Hậu Trần** (chữ Nôm: 茹後陳, chữ Hán: 後陳朝, Hán Việt: _Hậu Trần triều_) là một triều đại trong lịch sử Việt Nam từ 1407 đến 1414 mà các sách sử vẫn chưa thống nhất cách
**Trần Thủ Độ** (chữ Hán: 陳守度, 1194 – 1264), cũng gọi **Trung Vũ đại vương** (忠武大王), là một nhà chính trị Đại Việt, sống vào thời cuối triều Lý đầu triều Trần trong lịch sử
**Trần Vũ Đế** (chữ Hán: 陳武帝), tên thật là **Trần Bá Tiên** (陳霸先; 503 - 559) là vị vua đầu tiên, người sáng lập ra nhà Trần thời Nam-Bắc triều trong lịch sử Trung Quốc.
**Trận Waterloo** (phiên âm tiếng Việt: **Oa-téc-lô**) là trận chiến diễn ra vào ngày Chủ nhật 18 tháng 6 năm 1815, gần Waterloo, thuộc Bỉ. Quân Pháp dưới sự chỉ huy của Hoàng đế Napoleon
nhỏ|phải|Tượng thần bò trong bảo tàng văn hóa Lưỡng Hà **Tục thờ Bò** hay **tín ngưỡng thờ Bò** hay còn gọi là **thờ Thần Bò** hay **đạo thờ Bò** là việc thực hành các tín
**Trần Trọng Kim** (chữ Hán: 陳仲金; 1883 – 1953) là một học giả, nhà giáo dục, nhà nghiên cứu sử học, văn học, tôn giáo Việt Nam, bút hiệu **Lệ Thần**, từng làm thủ tướng
**Trần Thái Tông** (chữ Hán: 陳太宗 9 tháng 7 năm 1218 – 5 tháng 5 năm 1277), tên khai sinh là **Trần Cảnh** (陳煚), là vị hoàng đế đầu tiên của Hoàng triều Trần nước
**Trần Nhật Duật** (chữ Hán: 陳日燏, 1255 – 1330), được biết qua tước hiệu **Chiêu Văn vương** (昭文王) hay **Chiêu Văn đại vương** (昭文大王), là một nhà chính trị, quân sự Đại Việt thời Trần.
**Trận Peleliu** có mật danh là **Chiến dịch Stalemate II** là một trận chiến giữa quân đội Hoa Kỳ và Nhật Bản trong chiến tranh Thái Bình Dương, Thế chiến thứ 2 diễn ra từ
**Trận Königgrätz**, còn gọi là **Trận Sadowa** hay **Trận Sadová** theo tiếng Tiệp Khắc, là trận đánh then chốt của cuộc Chiến tranh Áo-Phổ, diễn ra vào ngày 3 tháng 7 năm 1866, và chấm
**Trận Kolubara** (Tiếng Đức: Schlacht an der Kolubara, Tiếng Serbia: Kolubarska bitka, Колубарска битка) là trận đánh diễn ra giữa Đế quốc Áo-Hung và Serbia vào tháng 11 và tháng 12 năm 1914 tại mặt
Tranh vẽ của Nhật Bản mô tả [[Khổng Tử, người sáng lập ra Nho giáo. Dòng chữ trên cùng ghi "_Tiên sư Khổng Tử hành giáo tượng_"]] **Nho giáo** (chữ Hán: ) hay **Nho gia**
**Trần Khánh Dư** (chữ Hán: 陳慶餘, 13 tháng 3, 1240 - 23 tháng 4, 1340), hiệu là **Nhân Huệ vương** (仁惠王), là một chính khách, nhà quân sự Đại Việt dưới thời đại nhà Trần.
Chiến trường Quảng Trị năm 1972 **Mặt trận Trị Thiên Huế năm 1972** là một trong các chiến trường chính của Chiến tranh Việt Nam năm 1972. Kết thúc năm 1972, với các diễn biến
**Trận Ardennes**, còn gọi là **các trận Longwy và Neufchateau**, diễn ra từ ngày 21 cho đến ngày 23 tháng 8 năm 1914, trong chuỗi trận Biên giới Bắc Pháp giữa quân đội Đức với
**Trận Appomattox Court House**, xảy ra vào sáng ngày 9 tháng 4 năm 1865, là trận giao tranh cuối cùng của Binh đoàn Bắc Virginia dưới quyền chỉ huy của đại tướng Liên minh miền
là loại ngư lôi có đường kính 610 mm được sử dụng bởi Hải quân Đế quốc Nhật Bản (do được thiết kế theo lịch của Nhật Bản khi đó là năm 2593). Ngư lôi Type
**Chiến dịch đổ bộ của lính dù Mỹ ở Normandie** là chiến dịch nhảy dù của Quân đội Hoa Kỳ trong cuộc đổ bộ vào Normandie trong Chiến tranh thế giới thứ hai, bắt đầu
**Trận Kolín** diễn ra vào ngày 18 tháng 6 năm 1757 trên chiến trường Trung Âu của cuộc Chiến tranh Bảy năm, giữa 35.000 quân Phổ do vua Friedrich Đại đế chỉ huy và hơn
**Trận Châlons**, hay còn gọi là **trận đồng bằng Catalaunian** hoặc **trận Campus Mauriacus**, diễn ra vào năm 451 giữa một bên là người Hung cùng các đồng minh do vua Attila chỉ huy đối
**Trận chiến Eo biển Otranto** là một nỗ lực của Hải quân Đế quốc Áo-Hung trong việc phá vỡ Rào chắn Otranto của hải quân phe Hiệp ước tại eo biển Otranto trong hai ngày
nhỏ|phải|Bò tót Tây Ban Nha nhỏ|phải|Toro De Lidia ở Colombia **Bò tót Tây Ban Nha** hay tên gọi chính xác là **bò đấu Tây Ban Nha** (**Toro Bravo**, _toro de lidia_, _toro lidiado_, _ganado bravo_,
**Trận Gettysburg** là trận chiến đẫm máu nhất và được xem là chiến thắng lớn lao nhất của Liên bang miền Bắc của cuộc phân tranh Nam-Bắc, mà chí ít là một bước ngoặt trên
**Trần Tự Khánh** (chữ Hán: 陳嗣慶;1175 – 3 tháng 1 năm 1224), là một chính trị gia, viên tướng trứ danh thời kỳ suy vong của triều đại nhà Lý, người lãnh đạo chính thống
**Trần Tiến** (tên đầy đủ **Trần Việt Tiến**, sinh 16 tháng 5 năm 1947) là một nhạc sĩ người Việt Nam. Ông vừa là nhạc sĩ sáng tác ca khúc quần chúng, vừa là ca
**Trận Rotterdam** là một trận đánh thuộc chiến tranh thế giới thứ hai diễn ra từ ngày 10 đến 14 tháng 5 năm 1940, là một phần trong cuộc xâm chiếm Hà Lan của Đức.
**Bò tót Đông Dương** hay **Bò tót Đông Nam Á** (Danh pháp khoa học: _Bos gaurus laosiensis_ hay _Bos gaurus readei_) là một phân loài của loài bò tót được ghi nhận ở vùng Đông
**Huy Chân Công chúa** (輝真公主) hay **Trinh Thục phi** (貞淑妃) Trần Thị Ngọc Hiền (còn có tên khác là Ngọc Dung, Ngọc Huyên) (1377 - ?) là một vị Công chúa nhà Trần và là
phải|Quân [[Liên bang miền Bắc Hoa Kỳ|Liên bang miền Bắc xung phong]]Trong 4 năm của cuộc Nội chiến Hoa Kỳ quân Liên bang miền Bắc và quân Liên minh miền Nam đánh nhau trong nhiều