Công NghệGrokking

Grokking: Lỗ hổng Heartbleed rò rỉ bộ nhớ OpenSSL bằng cách nào?

Heartbleed là lỗi thiếu một bước kiểm tra biên trong tiện ích heartbeat của OpenSSL, khiến máy chủ vô tình gửi trả bộ nhớ riêng, bao gồm cả khóa riêng tư, cho bất kỳ ai gửi yêu cầu.

Tuấn Kiệt|
Grokking: Lỗ hổng Heartbleed rò rỉ bộ nhớ OpenSSL bằng cách nào?
Photo: Pixabay — via Pexels • Nguồn ảnh

Tháng 4 năm 2014, cả internet chấn động vì một dòng code thiếu đúng bốn ký tự kiểm tra. Heartbleed, tên chính thức là CVE-2014-0160, không phải một cuộc tấn công phức tạp cần kỹ thuật cao siêu. Nó chỉ đơn giản là OpenSSL, thư viện mã hóa chạy ngầm trong khoảng hai phần ba máy chủ HTTPS trên thế giới, quên kiểm tra xem kẻ tấn công có đang nói dối về kích thước dữ liệu hay không. Hậu quả: máy chủ vô tình đọc và gửi trả bộ nhớ riêng của chính nó, bao gồm cả khóa riêng tư dùng để mã hóa toàn bộ lưu lượng.

Nhịp tim TLS: tính năng vô hại biến thành cửa hậu

Heartbeat là một tiện ích mở rộng nhỏ của giao thức TLS, ra đời để duy trì kết nối mà không cần bắt tay lại từ đầu. Cơ chế rất đơn giản: một bên gửi một gói tin chứa dữ liệu bất kỳ cùng con số cho biết dữ liệu dài bao nhiêu byte, bên kia có nhiệm vụ sao chép y nguyên phần dữ liệu đó và gửi trả lại, giống như hét vào vách núi rồi chờ tiếng vọng. Vấn đề nằm ở chỗ: server tin tưởng tuyệt đối vào con số độ dài do client tự khai, mà không hề đối chiếu với độ dài thực tế của dữ liệu đi kèm.

Bước kiểm tra biên bị bỏ quên

Trong mã nguồn OpenSSL, hàm xử lý heartbeat đọc trường payload length do client gửi lên, rồi dùng chính con số đó để gọi memcpy sao chép dữ liệu vào bộ đệm phản hồi. Đáng lẽ trước khi sao chép, chương trình phải so sánh con số client khai có khớp với số byte thực sự gửi kèm hay không. Bước so sánh này, chỉ vài dòng code, đã bị bỏ sót khi lập trình viên thêm tính năng heartbeat vào cuối năm 2011. Kẻ tấn công chỉ cần gửi một byte dữ liệu nhưng khai độ dài là 65535 byte. OpenSSL sẽ ngoan ngoãn sao chép luôn 65534 byte rác từ vùng nhớ liền kề, những gì từng nằm trong bộ nhớ trước đó.

Từ vài byte rác đến rò rỉ khóa riêng tư

Vùng nhớ bị lộ ra không phải dữ liệu ngẫu nhiên vô hại. Vì OpenSSL tái sử dụng cùng một khối bộ nhớ cho nhiều tác vụ, phần rò rỉ có thể chứa mật khẩu người dùng vừa đăng nhập, cookie phiên làm việc, hoặc tệ nhất là khóa riêng tư của chứng chỉ SSL, thứ dùng để giải mã toàn bộ lưu lượng HTTPS đi qua máy chủ đó. Kẻ tấn công chỉ cần lặp lại yêu cầu heartbeat hàng nghìn lần, mỗi lần lấy một mảnh 64KB bộ nhớ khác nhau, rồi ghép lại như trò chơi xếp hình để dò tìm khóa riêng tư. Toàn bộ quá trình này không để lại dấu vết bất thường nào trong log server, vì heartbeat vốn là lưu lượng hợp lệ.

Hai năm rưỡi ẩn mình và cuộc chạy đua vá lỗi

Lỗi này nằm im trong OpenSSL suốt từ cuối 2011 đến tháng 4 năm 2014 mới bị nhóm nghiên cứu Codenomicon và một kỹ sư bảo mật của Google phát hiện gần như cùng lúc. Quá trình công bố có trách nhiệm diễn ra gấp gáp: bản vá được chuẩn bị âm thầm, rồi công bố công khai đồng thời với việc phát hành phiên bản OpenSSL mới, kèm tên gọi dễ nhớ và logo trái tim rỉ máu để cả ngành công nghệ nhận ra mức độ nghiêm trọng ngay lập tức. Hàng trăm nghìn máy chủ phải thu hồi và cấp lại chứng chỉ SSL, hàng triệu người dùng được khuyến cáo đổi mật khẩu, và toàn ngành an ninh mạng rút ra một bài học đơn giản: một bước kiểm tra biên bị thiếu cũng đủ sức đánh sập niềm tin vào toàn bộ hạ tầng mã hóa của công nghệ internet hiện đại.

Chia sẻ

Bình luận (0)

0/1000
Đang tải...

Tin cùng chuyên mục

Xem tất cả →
Grokking: Apple ra MacBook Pro màn hình OLED, nhưng điểm ảnh tự phát sáng hoạt động ra sao
Grokking

Apple ra MacBook Pro màn hình OLED, nhưng điểm ảnh tự phát sáng hoạt động ra sao

Apple ra MacBook Pro với màn hình XDR mới. Bài giải thích vì sao điểm ảnh tự phát sáng cho màu đen thực sự và cách giảm nguy cơ cháy hình.

Dành cho bạn