Khám phá CodeQL trong GitHub

Đã hoàn thành

CodeQL là gì

CodeQL là một công cụ phân tích mã ngữ nghĩa được phát triển bởi GitHub coi mã là dữ liệu. Thay vì chỉ tìm kiếm các mẫu văn bản, CodeQL hiểu cấu trúc và ý nghĩa của mã của bạn, cho phép phân tích chất lượng và bảo mật phức tạp.

Các công cụ phân tích tĩnh truyền thống thường tạo ra kết quả dương tính giả vì chúng sử dụng đối sánh mẫu đơn giản. Cách tiếp cận ngữ nghĩa của CodeQL hiểu ngữ cảnh mã, mối quan hệ giữa các phần tử mã và luồng dữ liệu qua các ứng dụng, giúp phát hiện lỗ hổng chính xác hơn.

Các đặc điểm chính của CodeQL

CodeQL coi mã như một cơ sở dữ liệu:

  • Đại diện cấu trúc: Chuyển đổi mã nguồn thành cơ sở dữ liệu nắm bắt cây cú pháp, biểu đồ luồng điều khiển và đường dẫn luồng dữ liệu.
  • Định dạng có thể truy vấn: Làm cho mã có thể truy vấn được bằng ngôn ngữ truy vấn chuyên dụng, tương tự như truy vấn cơ sở dữ liệu truyền thống.
  • Cách tiếp cận bất khả tri ngôn ngữ: Hỗ trợ nhiều ngôn ngữ lập trình bao gồm C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go và Swift.
  • Phạm vi bảo hiểm toàn diện: Phân tích không chỉ các tệp riêng lẻ mà còn toàn bộ cơ sở mã với tất cả các kết nối của chúng.

CodeQL cho phép phân tích bảo mật chính xác:

  • Phân tích biến thể: Sau khi xác định được một lỗ hổng, bạn có thể viết truy vấn để tìm các vấn đề tương tự trên toàn bộ cơ sở mã của mình.
  • Phân tích luồng dữ liệu: Theo dõi cách dữ liệu di chuyển qua ứng dụng của bạn từ nguồn (đầu vào của người dùng) đến chìm (hoạt động nhạy cảm).
  • Theo dõi ô nhiễm: Xác định khi dữ liệu không đáng tin cậy đến các hoạt động nhạy cảm mà không có xác thực hoặc vệ sinh thích hợp.
  • Phân tích lưu lượng kiểm soát: Hiểu các đường dẫn thực thi và logic có điều kiện để tìm các lỗ hổng chỉ xảy ra trong các điều kiện cụ thể.

Cách thức hoạt động của CodeQL

Phân tích CodeQL bao gồm ba giai đoạn riêng biệt để chuyển đổi mã nguồn thành các phát hiện bảo mật có thể hành động:

Giai đoạn 1: Tạo cơ sở dữ liệu CodeQL

Bước đầu tiên trích xuất một biểu diễn có cấu trúc của mã của bạn:

  • Trích xuất mã: Phân tích các tệp nguồn của bạn trong quá trình biên dịch hoặc thông qua phân tích tĩnh.
  • Tạo cơ sở dữ liệu: Xây dựng cơ sở dữ liệu toàn diện đại diện cho cấu trúc mã của bạn, bao gồm cây cú pháp trừu tượng, biểu đồ luồng điều khiển và phần phụ thuộc dữ liệu.
  • Thu thập siêu dữ liệu: Ghi lại vị trí tệp, số dòng, phạm vi biến, lệnh gọi hàm và hệ thống phân cấp lớp.
  • Tối ưu hóa: Lập chỉ mục cơ sở dữ liệu để truy vấn hiệu quả, ngay cả trên các cơ sở mã lớn.

Cơ sở dữ liệu này trở thành nền tảng cho tất cả các phân tích tiếp theo. Nó được tạo một lần và có thể được truy vấn nhiều lần, giúp phân tích bảo mật lặp đi lặp lại hiệu quả.

Giai đoạn 2: Chạy truy vấn CodeQL

Khi cơ sở dữ liệu tồn tại, bạn thực hiện các truy vấn để tìm các vấn đề bảo mật:

  • Gói truy vấn tiêu chuẩn: GitHub cung cấp các bộ truy vấn được tuyển chọn cho các lỗ hổng phổ biến (OWASP Top 10, tiêu chuẩn CWE).
  • Truy vấn tùy chỉnh: Viết truy vấn của riêng bạn để tìm các mẫu bảo mật cụ thể của tổ chức hoặc vi phạm tiêu chuẩn mã hóa.
  • Thực hiện truy vấn: Công cụ CodeQL chạy các truy vấn đối với cơ sở dữ liệu, tìm kiếm các mẫu mã khớp với chữ ký lỗ hổng.
  • Hiệu năng: Các truy vấn thực thi nhanh chóng vì chúng hoạt động trên cơ sở dữ liệu được lập chỉ mục chứ không phải các tệp nguồn thô.

Ví dụ về danh mục truy vấn bao gồm:

  • Lỗ hổng tiêm: SQL injection, command injection, cross-site scripting.
  • Vấn đề xác thực: Chính sách mật khẩu yếu, thiếu kiểm tra xác thực, quản lý phiên không an toàn.
  • Các vấn đề về mật mã: Thuật toán yếu, thông tin đăng nhập được mã hóa cứng, không đủ tính ngẫu nhiên.
  • Quản lý nguồn lực: Rò rỉ bộ nhớ, cạn kiệt tài nguyên, tiêu thụ tài nguyên không kiểm soát.

Giai đoạn 3: Giải thích kết quả

Giai đoạn cuối cùng trình bày các phát hiện ở các định dạng có thể hành động:

  • Xếp hạng kết quả: CodeQL ưu tiên các phát hiện theo mức độ nghiêm trọng, mức độ tin cậy và khả năng khai thác.
  • Thông tin theo ngữ cảnh: Mỗi phát hiện bao gồm vị trí tệp, số dòng, đoạn mã bị ảnh hưởng và đường dẫn luồng dữ liệu.
  • Hướng dẫn khắc phục: Kết quả bao gồm giải thích về lỗ hổng bảo mật và khuyến nghị khắc phục.
  • Tích hợp: Kết quả tích hợp với tab Bảo mật GitHub, chú thích yêu cầu kéo và tệp SARIF cho các công cụ bên ngoài.

Ngôn ngữ truy vấn CodeQL

Các truy vấn CodeQL được viết bằng ngôn ngữ khai báo được thiết kế đặc biệt để phân tích mã:

Cấu trúc và cú pháp truy vấn

CodeQL sử dụng lập trình logic hướng đối tượng:

  • Các lớp và vị ngữ: Xác định những gì bạn đang tìm kiếm bằng cách sử dụng các lớp đại diện cho các phần tử mã (hàm, biến, biểu thức).
  • Cách tiếp cận khai báo: Mô tả những gì bạn muốn tìm hơn là cách tìm nó.
  • Khớp mẫu: Sử dụng vị ngữ để khớp các mẫu mã và mối quan hệ.
  • Khả năng kết hợp: Xây dựng các truy vấn phức tạp bằng cách kết hợp các vị ngữ đơn giản hơn.

Ví dụ về cấu trúc truy vấn:

import javascript

from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"

Truy vấn này tìm các lỗ hổng SQL injection bằng cách:

  • Xác định các điểm thực thi SQL.
  • Tìm nguồn đầu vào của người dùng.
  • Theo dõi luồng dữ liệu từ đầu vào đến thực thi SQL.
  • Báo cáo lỗ hổng với ngữ cảnh.

Thư viện truy vấn tiêu chuẩn

GitHub cung cấp các thư viện truy vấn phong phú:

  • Truy vấn bảo mật: Phát hiện OWASP 10 lỗ hổng hàng đầu, danh mục CWE và các vấn đề bảo mật theo ngôn ngữ cụ thể.
  • Truy vấn chất lượng mã: Tìm mùi mã, vấn đề về khả năng bảo trì, vấn đề về hiệu suất và vi phạm phương pháp hay nhất.
  • Đóng góp của cộng đồng: Hàng ngàn truy vấn được đóng góp bởi các nhà nghiên cứu và nhà phát triển bảo mật.
  • Cập nhật thường xuyên: GitHub Security Lab liên tục bổ sung các truy vấn mới cho các lỗ hổng mới nổi.

Bạn có thể sử dụng các truy vấn này as-is hoặc tùy chỉnh chúng cho nhu cầu cụ thể của mình.

CodeQL trong bảo mật GitHub

CodeQL tích hợp sâu với các tính năng bảo mật của GitHub:

Quét mã với CodeQL

Phân tích bảo mật tự động:

  • Thiết lập mặc định: Bật tính năng quét CodeQL bằng một cú nhấp chuột trong cài đặt kho lưu trữ.
  • Quét theo lịch trình: Tự động quét trên mọi yêu cầu đẩy, kéo hoặc theo lịch trình.
  • Hỗ trợ đa ngôn ngữ: Tự động phát hiện các ngôn ngữ trong kho lưu trữ của bạn và chạy các truy vấn thích hợp.
  • Trình bày kết quả: Các phát hiện bảo mật xuất hiện trong tab Bảo mật với giải thích chi tiết.

Tích hợp yêu cầu kéo:

  • Chú thích nội tuyến: Các phát hiện bảo mật xuất hiện dưới dạng nhận xét trực tiếp trên các dòng mã dễ bị tấn công trong các yêu cầu kéo.
  • Kiểm tra chặn: Định cấu hình CodeQL làm kiểm tra bắt buộc phải vượt qua trước khi hợp nhất.
  • Quét vi sai: Chỉ báo cáo các lỗ hổng mới do yêu cầu kéo đưa ra, giảm nhiễu.
  • Phản hồi của nhà phát triển: Các nhà phát triển nhìn thấy các vấn đề bảo mật ngay lập tức trong khi mã vẫn còn mới mẻ trong tâm trí của họ.

Bảo mật Nâng cao GitHub

Đối với các tổ chức, GitHub Advanced Security cung cấp các chức năng bổ sung:

  • Quét kho lưu trữ riêng tư: Chạy CodeQL trên các kho lưu trữ riêng.
  • Thực hiện truy vấn tùy chỉnh: Tải lên và chạy các truy vấn dành riêng cho tổ chức.
  • Tổng quan về bảo mật: Bảng điều khiển hiển thị trạng thái bảo mật trên tất cả các kho lưu trữ.
  • Quản lý cảnh báo: Phân loại, chỉ định và theo dõi các phát hiện bảo mật giữa các nhóm.

Sử dụng CodeQL trong quy trình CI/CD

CodeQL mở rộng ra ngoài GitHub để tích hợp với các hệ thống CI/CD khác nhau:

Phương pháp tiếp cận hội nhập

Tích hợp GitHub Actions:

- name: Initialize CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: javascript, python

- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v2

Quy trình làm việc này:

  • Khởi tạo CodeQL cho các ngôn ngữ được chỉ định.
  • Xây dựng ứng dụng của bạn (hoặc phân tích mà không cần xây dựng).
  • Chạy truy vấn bảo mật.
  • Tải kết quả lên tab Bảo mật GitHub.

Tích hợp Azure Pipelines:

CodeQL có thể chạy trong Azure Pipelines bằng giao diện dòng lệnh:

  • Cài đặt CodeQL CLI: Tải xuống và cài đặt gói CodeQL trong quy trình của bạn.
  • Tạo cơ sở dữ liệu: Chạy codeql database create trong quá trình xây dựng.
  • Phân tích cơ sở dữ liệu: Thực thi codeql database analyze với các gói truy vấn đã chọn.
  • Kết quả xuất: Tạo tệp SARIF để trực quan hóa trong Azure DevOps.

Các hệ thống CI/CD khác:

CodeQL CLI hỗ trợ bất kỳ nền tảng CI/CD nào:

  • Jenkins: Thực hiện phân tích CodeQL dưới dạng các bước xây dựng.
  • GitLab CI / CD: Chạy CodeQL trong quy trình GitLab với đầu ra SARIF.
  • Vòng trònCI: Tích hợp quét CodeQL vào quy trình làm việc của CircleCI.
  • Hệ thống tùy chỉnh: Sử dụng CodeQL CLI từ bất kỳ môi trường nào có thể chạy các công cụ dòng lệnh.

Cổng an ninh

Sử dụng kết quả CodeQL làm cổng chất lượng:

  • Các bản dựng không thành công: Định cấu hình quy trình để không thành công khi CodeQL tìm thấy lỗ hổng có mức độ nghiêm trọng cao.
  • Phân tích xu hướng: Theo dõi các chỉ số bảo mật theo thời gian để đo lường sự cải thiện.
  • Yêu cầu tuân thủ: Tạo bằng chứng về quét bảo mật để kiểm tra và chứng nhận tuân thủ.
  • Tự động khắc phục: Kích hoạt quy trình làm việc tự động khi phát hiện các lỗ hổng cụ thể.

Công cụ phát triển CodeQL

CodeQL cung cấp các công cụ để tạo và kiểm tra các truy vấn:

Tiện ích mở rộng Visual Studio Code

Tiện ích mở rộng CodeQL chính thức cho VS Code cung cấp:

  • Phát triển truy vấn: Viết và kiểm tra các truy vấn CodeQL với tính năng đánh dấu cú pháp, tự động hoàn thành và tài liệu nội tuyến.
  • Phân tích cơ sở dữ liệu cục bộ: Chạy truy vấn đối với cơ sở dữ liệu được tạo từ cơ sở mã cục bộ.
  • Trực quan hóa kết quả: Xem kết quả truy vấn với điều hướng mã nguồn và đường dẫn luồng dữ liệu.
  • Hỗ trợ gỡ lỗi: Thực hiện truy vấn từng bước để hiểu kết quả và tối ưu hóa hiệu suất.

Giao diện dòng lệnh

CodeQL CLI cho phép phân tích kịch bản:

  • Tạo cơ sở dữ liệu:codeql database create trích xuất mã thành định dạng có thể truy vấn.
  • Thực hiện truy vấn:codeql database analyze chạy truy vấn và tạo kết quả.
  • Truy vấn kiểm tra:codeql test run xác thực các truy vấn dựa trên các trường hợp thử nghiệm.
  • Quản lý gói: Tải xuống và quản lý các gói truy vấn tiêu chuẩn.

Lợi ích của CodeQL đối với tự động hóa bảo mật

Tích hợp CodeQL vào quy trình DevSecOps của bạn mang lại những lợi thế đáng kể:

Năng suất của nhà phát triển

Phát hiện sớm:

  • Bảo mật dịch chuyển sang trái: Tìm lỗ hổng trong quá trình phát triển hơn là trong sản xuất.
  • Khắc phục nhanh hơn: Khắc phục sự cố khi mã mới và thay đổi nhỏ.
  • Cơ hội học tập: Các nhà phát triển tìm hiểu các phương pháp mã hóa an toàn từ phản hồi ngay lập tức.
  • Giảm chuyển đổi ngữ cảnh: Các phát hiện bảo mật xuất hiện trong các công cụ phát triển quen thuộc.

Kết quả chính xác:

  • Dương tính giả thấp: Phân tích ngữ nghĩa tạo ra những phát hiện chính xác hơn so với đối sánh mẫu.
  • Thông tin theo ngữ cảnh: Kết quả bao gồm các đường dẫn luồng dữ liệu cho thấy chính xác cách các lỗ hổng xảy ra.
  • Các phát hiện ưu tiên: Tập trung vào các vấn đề có thể khai thác hơn là các mối quan tâm lý thuyết.
  • Phát hiện biến thể: Tìm tất cả các trường hợp của một mẫu lỗ hổng, không chỉ là các ví dụ rõ ràng.

Bảo mật tổ chức

Phạm vi bảo hiểm toàn diện:

  • Toàn bộ cơ sở mã: Phân tích tất cả mã, bao gồm các phần phụ thuộc của bên thứ ba và các thành phần kế thừa.
  • Nhiều ngôn ngữ: Phân tích bảo mật thống nhất trên các ứng dụng đa ngôn ngữ.
  • Tiêu chuẩn nhất quán: Áp dụng các quy tắc bảo mật giống nhau trên tất cả các kho lưu trữ.
  • Phân tích lịch sử: Quét mã hiện có để thiết lập đường cơ sở bảo mật.

Bảo mật có thể mở rộng:

  • Quét tự động: Không cần đánh giá bảo mật thủ công cho mọi cam kết.
  • Giám sát liên tục: Quét thường xuyên phát hiện các lỗ hổng mới được tiết lộ.
  • Bảo mật dưới dạng mã: Hệ thống hóa các yêu cầu bảo mật dưới dạng truy vấn được lưu trữ trong kiểm soát phiên bản.
  • Chia sẻ kiến thức: Thư viện truy vấn nắm bắt kiến thức bảo mật của tổ chức.

Tuân thủ và quản trị

Dấu vết kiểm tra:

  • Lịch sử quét: Ghi lại tất cả các lần quét bảo mật với dấu thời gian và kết quả.
  • Vòng đời tìm kiếm: Theo dõi lỗ hổng từ khâu phát hiện đến khắc phục.
  • Thực thi chính sách: Chứng minh rằng quá trình quét bảo mật xảy ra cho mọi bản phát hành.
  • Tạo bằng chứng: Tạo báo cáo cho kiểm toán viên và khuôn khổ tuân thủ.

Để biết thêm thông tin về CodeQL, hãy xem Tổng quan về CodeQL.

Để biết các công cụ sẵn dùng, hãy công cụ CodeQL.