Tràn bộ nhớ tiếng Anh là gì

Overflow Là Gì – Lỗi Tràn Bộ Nhớ Đệm

Trong những ngành nghề an ninh máy tính and 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 and chương trình bị kết thúc, hoặc khi người sử 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 tình huống 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ẽ tỳ lên những vị trí đặt bộ nhớ liền kề. Dữ liệu bị ghi đè có thể kể cả những bộ nhớ đệm khác, những biến and dữ liệu điều khiển luồng chạy của chương trình [program flow control].

Những lỗi tràn bộ đệm có thể khiến cho một tiến trình đổ vỡ hoặc cho ra những kết quả sai. Những lỗi này có thể đc kích hoạt bởi những dữ liệu vào được làm đặc điểm để thực thi những đoạn mã phá hoại hoặc để khiến cho chương trình chuyển động một phương thức không như chờ đón. Bằng phương thức đó, những lỗi tràn bộ đệm gây ra nhiều lỗ hổng bảo mật [vulnerability] so với ứng dụng and tạo cơ sở cho nhiều thủ thuật khai thác [exploit]. hethongbokhoe.vnệc check biên [bounds checking] đầy đủ bởi lập trình hethongbokhoe.vnên hoặc trình biên dịch có thể chặn đứng những lỗi tràn bộ đệm.

Bài Viết: Overflow là gì

Mục lục

Xem Ngay: Brooch Là Gì

1 Diễn tả kỹ thuật 1.1 Ví dụ căn bản 1.2 Tràn bộ nhớ đệm trên stack 1.3 Mã nguồn ví dụ 2 Khai thác 2.1 Khai thác lỗi tràn bộ đệm trên stack 2.2 Khai thác lỗi tràn bộ đệm trên heap 2.3 Cản trở so với những thủ thuật khai thác 3 Chống tràn bộ đệm 3.1 Chọn lựa ngôn ngữ lập trình 3.2 Áp dụng những thư hethongbokhoe.vnện an toàn và tin cậy 3.3 Chống tràn bộ nhớ đệm trên stack 3.4 Bảo vệ không trung thực thi 3.5 Bất kể hóa sơ đồ không trung Vị trí 3.6 Check sâu so với gói tin 4 Lịch sử khai thác 5 Xem Ngay 6 Chú thích 7 Link ngoài 7.1 Tiếng hethongbokhoe.vnệt 7.2 Tiếng Anh

Xem Ngay:  He Là Gì - Se, Oe, Ge, Be Là Gì Trong Ngôn Tình

Xem Ngay: Độ Phân Giải Tiếng Anh Là Gì, Độ Phân Giải Màn Hình Tiếng Anh Là Gì

Diễn tả kỹ thuật

Một lỗi tràn bộ nhớ đệm xảy ra khi dữ liệu đc hethongbokhoe.vnết vào một bộ nhớ đệm, mà do không check biên đầy đủ nên đã ghi tỳ lên vùng bộ nhớ liền kề and làm hỏng những kinh phí dữ liệu tại những Vị trí bộ nhớ kề với vùng bộ nhớ đệm đó. Hiện tượng này hay xảy ra nhất khi coppy 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ăn 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, and B là một số nguyên kích thước 2 byte. Mở màn, A chỉ chứa toàn những byte kinh phí 0, còn B chứa kinh phí 3. Những ký tự có kích thước 1 byte.

Tên biến A A A A A A A A B B Trị giá 0 0 0 0 0 0 0 0 0 3

Hiện 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 để ghi lại kết thúc xâu. Vì không check độ dài xâu, nên xâu ký tự mới đã tỳ lên kinh phí của B:

Tên biến A A A A A A A A B B Trị giá “e” “x” “c” “e” “s” “s” “i” “v” “e” 0

Tuy lập trình hethongbokhoe.vnên không có ý định sửa đổi B, nhưng kinh phí của B đã bị thay thế bởi một số đc tạo ra 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 cần sử dụng mã ASCII, ký tự “e” and tiếp theo là một byte 0 sẽ biến thành số 25856.

Xem Ngay:  Bệnh Tiểu đường Là Gì, Nguyên Nhân Gây Và Cách điều Trị

Nếu B là phần tử dữ liệu duy nhất còn lại trong số những biến đc chương trình định nghĩa, hethongbokhoe.vnệc hethongbokhoe.vnết một xâu ký tự dài hơn nữa and 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] and tiến trình sẽ kết thúc.

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

Lân cận hethongbokhoe.vnệc sửa đổi những biến không ảnh hưởng, 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 để khiến cho một chương trình đang chạy thực thi một đoạn mã tùy ý đc thỏa mãn nhu cầu. Những kỹ thuật để một tin tặc chiếm quyền điều khiển một tiến trình tùy vào vùng bộ nhớ mà bộ đệm đc đặt tại đó. Ví dụ, vùng bộ nhớ stack, địa chỉ dữ liệu có thể đc tạm thời “đẩy” xuống “đỉnh” ngăn xếp [push], and sau đó đc “nhấc ra” [pop] để đọc kinh phí của biến. Nhiều lúc, khi một hàm [function] thuở đầu thực thi, những phần tử dữ liệu tạm thời [những biến địa phương] đc đẩy vào, and chương trình có thể truy nhập đến những dữ liệu này nhìn trong suốt thời hạn chạy hàm đó. Không chỉ có hiện tượng tràn stack [stack overflow] mà còn tồn tại cả tràn heap [heap overflow].

Trong ví dụ sau, “X” là dữ liệu đã có lần tọa lạc tại stack khi chương trình thuở đầu thực thi; sau đó chương trình gọi hàm “Y”, hàm này yên cầu một lượng bé dại bộ nhớ cho riêng mình; and sau đó “Y” gọi hàm “Z”, “Z” yên cầu một bộ nhớ đệm to:

Xem Ngay:  Quảng cáo google display network là gì và ưu nhược điểm của nó

Z Z Z Z Z Z Y X X X             : / / /

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:

Z Z Z Z Z Z Y X X X . . . . . . . . / /

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

Thể Loại: San sẻ Kiến Thức Cộng Đồng

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ục lục

  • 1 Mô tả kỹ thuật
    • 1.1 Ví dụ cơ bản
    • 1.2 Tràn bộ nhớ đệm trên stack
    • 1.3 Mã nguồn ví dụ
  • 2 Khai thác
    • 2.1 Khai thác lỗi tràn bộ đệm trên stack
    • 2.2 Khai thác lỗi tràn bộ đệm trên heap
    • 2.3 Cản trở đối với các thủ thuật khai thác
  • 3 Chống tràn bộ đệm
    • 3.1 Lựa chọn ngôn ngữ lập trình
    • 3.2 Sử dụng các thư viện an toàn
    • 3.3 Chống tràn bộ nhớ đệm trên stack
    • 3.4 Bảo vệ không gian thực thi
    • 3.5 Ngẫu nhiên hóa sơ đồ không gian địa chỉ
    • 3.6 Kiểm tra sâu đối với gói tin
  • 4 Lịch sử khai thác
  • 5 Xem thêm
  • 6 Chú thích
  • 7 Liên kết ngoài
    • 7.1 Tiếng Việt
    • 7.2 Tiếng Anh

Mô tả kỹ thuậtSửa đổi

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ảnSửa đổi

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.

Tên biến Giá trị
A A A A A A A A B B
0 0 0 0 0 0 0 0 0 3

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:

Tên biến Giá trị
A A A A A A A A B B
'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 'e' 0

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 stackSửa đổi

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:

Z Z Z Z Z Z Y X X X
: / / /

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:

Z Z Z Z Z Z Y X X X
. . . . . . . . / /

Đ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ụSửa đổi

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ó.[1]

/* overflow.c - demonstrates a buffer overflow */ #include #include int main[int argc, char *argv[]] { char buffer[10]; if [argc

Chủ Đề