Loading
May 8, 2023By Harry Ha

Taint Tracking trong quá trình Static Code Analysis

Taint Tracking là một trong những kỹ thuật phổ biến được thực hiện trong Static Code Analysis hoặc Whitebox Testing.

Static Code Analysis

Static Code Analysis (phân tích mã nguồn tĩnh) là quá trình kiểm tra và phân tích mã nguồn của một ứng dụng mà không cần chạy nó. Mục đích của Static Code Analysis là để tìm ra các lỗi, lỗ hổng bảo mật, và vấn đề về chất lượng mã nguồn trước khi ứng dụng được triển khai hoặc chạy thực tế.

  • Taint Tracking hay Data flow analysis sẽ theo dõi luồng dữ liệu trong mã nguồn để phát hiện các vấn đề bảo mật tiềm ẩn.
  • Pattern matching: Phương pháp này tìm kiếm các mẫu mã nguồn cụ thể đã được xác định trước để phát hiện lỗi, lỗ hổng bảo mật hoặc vi phạm các quy tắc lập trình. Pattern matching thường dựa trên các biểu thức chính quy (regex) hoặc cấu trúc cây cú pháp (AST). Kiểu như cứ thấy sốt là kết luận bị ốm.
  • Semantic analysis: Phân tích ngữ nghĩa tập trung vào ý nghĩa của mã nguồn, kiểm tra việc sử dụng đúng cách các biến, hàm, và đối tượng, giúp phát hiện các vấn đề như truy cập thuộc tính không tồn tại của một đối tượng hoặc gọi hàm với tham số không hợp lệ.
  • Metrics analysis: Phương pháp này thu thập các chỉ số liên quan đến mã nguồn như độ phức tạp của chương trình (cyclomatic complexity), độ dài của hàm, số lượng biến toàn cục, và tỷ lệ comment/mã, tỷ lệ lặp lại mã nguồn, giúp đánh giá chất lượng mã nguồn (Code Smell).

Taint Tracking

Kỹ thuật này sẽ theo dõi dữ liệu không an toàn được truyền vào và xem nó ảnh hưởng tới những chức năng (function) nào trong phần mềm. Các công cụ phân tích mã nguồn như Semgrep hoặc CodeQL sẽ áp dụng thuật Taint Tracking để tự động duyệt qua mã nguồn của ứng dụng và so sánh với các Rules về lỗ hổng đã biết trước hoặc tiêu chuẩn lập trình an toàn để tìm kiếm các rủi ro tiềm ẩn. Taint Tracking có thể phát hiện ra nhiều lỗ hổng phổ biến trong lập trình như:

  • Lỗi logic và tiềm ẩn như điều kiện kiểm tra sai, các biến không được khởi tạo, hoặc việc truy cập null.
  • Các vấn đề về đa luồng, bao gồm race condition, deadlock, hoặc việc sử dụng không đúng cách các cơ chế đồng bộ hóa.
  • Lỗ hổng bảo mật như SQL Injection, Cross-Site Scripting (XSS), Buffer Overflow, Path Traversal, hay Insecure Deserialization

Kỹ thuật này hoạt động như thế nào? Nó được giải thích ngắn gọn qua 3 bước sau đây:

Bước 1 – Tô màu dữ liệu. Giả sử nguồn (Source) nước sạch từ hồ chứa được đưa vào hệ thống ống nước của một thành phố. Trong quá trình dó, xuất hiện một số nguồn nước không an toàn (tainted) từ các công trình xây dựng, chất thải nhà máy hoặc từ Hacker gà. Nước từ những nguồn này sẽ được đánh dấu bằng cách nhuộm màu vàng. Trong ngành bảo mật người ta sử dụng mã khai thác (Payload).

Bước 2 – Theo dõi dữ liệu. Khi nước từ các nguồn di chuyển qua hệ thống ống nước, chúng ta sẽ theo dõi sự lan truyền của nước nhuộm màu. Điều này giúp chúng ta biết chính xác từ nguồn vào cho tới tay người dùng, thứ nước màu vàng đã ghé thăm những đâu.

Bước 3 – Kiểm tra dữ liệu. Chúng ta sẽ kiểm tra các vị trí mà nước đi qua (Sink) như vòi nước, máy giặt hay nói cách khác là các function trong phần mềm. Nếu chúng ta thấy Input độc hại đó gây ảnh hưởng tới các function này. Điều đó cho thấy có lỗ hổng trong hệ thống phần mềm.

Bằng cách sử dụng Static Code Analysis, các nhà phát triển có thể phát hiện và khắc phục các vấn đề trong mã nguồn sớm, giảm thiểu nguy cơ các lỗi gây ảnh hưởng đến người dùng cuối và giảm thiểu chi phí sửa chữa sau này.

Case-study: Tìm kiếm lỗ hổng SQL Injection

Để hiểu rõ hơn về cách thức hoạt động của Taint Tracking. Chúng ta hãy cùng xét ví dụ dưới đây. Công cụ SonarQube áp dụng kỹ thuật Taint Tracking để tìm kiếm lỗ hổng SQL Injection trong mã nguồn minh hoạ của tổ chức OWASP.

Taint Tracking
  • [1] Taint Tracking phát hiện hàm getTheParameter(String p) là Source. Dữ liệu của người dùng sẽ được nhập vào từ đây thông qua phương thức GET của HTTP Request
  • [2] Dữ liệu của ngừoi dùng được nhập vào từ tham số BenchmarkTest0043 trên URL từ trình duyệt có dạng index?BenchmarkTest0043=CookieHanHoan.
  • [3] Giá trị CookieHanHoan sẽ được gán vào biến param
  • [4] Giá trị này sau đó dược cộng vào chuỗi câu lệnh SQL để tạo thành công truy vấn INSERT INTO users (username, pasword) VALUES (‘foo’, ‘CookieHanHoan’).
  • [5] Sau đó câu truy vấn trên sẽ được gán vào biến sql
  • [6] Hàm statement.executeUpdate là Sink có nhiệm vụ thực thi câu truy vấn trong biến sql

Từ luồng dữ liệu trên, chúng ta không thấy từ Source cho tới Sink không chạy qua bất kỳ hàm nào thực hiện việc validate dữ liệu. Điều này có thể hiểu, người dùng có thể nhập vào bất kỳ giá trị gì mà họ muốn từ tham số ?BenchmarkTest0043 trên trình duyệt.

Để khai thác tên phiên bản MySQL trong lỗ hổng SQL Injection của case-study này. Hacker chỉ cần tạo ra Payload như sau để đầu độc chương trình:

'), ((SELECT version()), 'password'

Câu truy vấn lúc này sẽ hợp lệ, chương trình sẽ thực thi và tạo ra hai usename. Một có tên là foo và mật khẩu rộng, tài khoản còn lại có tên đăng nhập là tên phiên bản của MySQL.

INSERT INTO users (username, password) VALUES ('foo', ''), ((SELECT version()), 'password')

Công cụ tìm kiếm lỗ hổng trong mã nguồn phần mềm

Semgrep

Semgrep là một công cụ phân tích tĩnh mã nguồn mã nguồn mở, hỗ trợ nhiều ngôn ngữ lập trình như Python, JavaScript, Go, Java, C và Ruby. Semgrep không chỉ giúp tìm kiếm lỗ hổng bảo mật mà còn giúp kiểm tra chất lượng mã nguồn, phong cách lập trình và các vấn đề khác. Cộng đồng Semgrep đông đảo, với nhiều người đóng góp và chia sẻ quy tắc phân tích, giúp dễ dàng tùy chỉnh cho nhu cầu của dự án của bạn.

CodeQL

CodeQL là một ngôn ngữ truy vấn mã nguồn do GitHub phát triển, hỗ trợ nhiều ngôn ngữ lập trình, bao gồm cả Taint Tracking. Mặc dù CodeQL không hoàn toàn miễn phí, nhưng bạn có thể sử dụng nó miễn phí cho các dự án mã nguồn mở. CodeQL cũng có một cộng đồng lớn, giúp chia sẻ kiến thức và kỹ thuật phân tích mã nguồn hiệu quả.

SonarQube

SonarQube là một nền tảng phân tích mã nguồn mã nguồn mở, hỗ trợ nhiều ngôn ngữ lập trình, giúp kiểm tra chất lượng mã nguồn và tìm kiếm lỗ hổng bảo mật.

PyT (Python Taint)

PyT là một công cụ Taint Tracking dành cho mã nguồn Python, giúp tìm kiếm lỗ hổng bảo mật trong các ứng dụng web viết bằng Python.

FlowDroid

FlowDroid là một công cụ phân tích tĩnh dành cho ứng dụng Android, giúp theo dõi dữ liệu không an toàn trên ứng dụng và phát hiện các lỗ hổng tiềm ẩn.

Harry Ha

Whitehat hacker, Founder at Cookie Hân Hoan, Co-founder at CyRadar, Senior Penetration Tester, OSCP, CPENT, LPT, Pentest+

svg

What do you think?

It is nice to know your opinion. Leave a comment.

Leave a reply