CodeQL 결과 이해
이전 단위에서는 데이터베이스를 만들고 코드에서 추출된 파일을 검색했습니다. 이제 결과를 보고 해결해야 할 보안 취약성이 있는지 확인할 수 있습니다.
해석된 쿼리 결과는 Visual Studio Code용 CodeQL 확장의 소스 코드에 자동으로 표시됩니다. CodeQL CLI에서 생성하는 출력 결과는 다양한 도구와 함께 사용할 수 있는 다양한 형식일 수 있습니다.
쿼리 select 문을 수정하여 소스 코드에 분석 결과가 표시되는 방식을 제어할 수 있습니다. 쿼리를 개발하는 동안 다른 사용자가 쉽게 이해할 수 있도록 결과를 명확하고 쉽게 만들 수 있습니다. 쿼리 콘솔 또는 Visual Studio Code용 CodeQL 확장에서 사용자 고유의 쿼리를 작성하는 경우 선택할 수 있는 항목에 대한 제약 조건이 없습니다.
쿼리를 사용하여 GitHub 코드 검사에서 경고를 만들거나 CodeQL CLI를 사용하여 유효한 분석 결과를 생성하려면 문 보고서 결과를 필요한 형식으로 만들어야 select 합니다.
Copilot Autofix를 사용하여 워크플로 수정
CodeQL에서 문제를 식별한 후 가장 중요한 단계는 문제를 해결하는 것입니다. GitHub는 경고에서 바로 제안된 수정 사항으로 이동할 수 있게 함으로써 탐지와 해결을 통합합니다.
Copilot Autofix를 사용하여 경고 수정
보안 탭에서 CodeQL 경고를 열면 GitHub 영향을 받는 코드, 심각도 및 문제가 발생한 방법을 포함하여 문제에 대한 세부 정보를 표시합니다.
지원되는 경고의 경우 Copilot Autofix도 표시됩니다.
Copilot Autofix는 경고를 분석하고 제안된 수정 사항을 생성합니다. 여기에는 다음이 포함됩니다.
- 문제를 해결하는 코드 변경
- 문제가 발생하는 이유에 대한 설명
- 수정이 문제를 해결하는 방법에 대한 지침
수정 사항을 처음부터 수동으로 작성하는 대신 제안된 변경에서 시작합니다.
일반적인 워크플로는 다음과 같습니다.
- CodeQL은 워크플로에서 실행되고 경고를 만듭니다.
- 경고를 열고 영향을 받는 코드를 검토합니다.
- Copilot Autofix는 제안된 수정 사항을 생성합니다.
- 설명 및 제안된 변경 내용을 검토합니다.
- 끌어오기 요청을 만드는 수정 사항을 적용합니다.
- 끌어오기 요청은 검사를 실행하고 병합하기 전에 검토됩니다.
이 워크플로는 GitHub 인터페이스를 벗어나지 않고 검색을 수정에 직접 연결합니다.
Copilot Autofix는 변경 사항을 자동으로 적용하지 않습니다. 수정 사항을 검토하고 승인할 책임이 있습니다. 이렇게 하면 다음이 보장됩니다.
- 이 수정 사항은 코드베이스와 일치합니다.
- 필요한 경우 구현을 조정할 수 있습니다.
- 변경 사항은 기존 검토 절차를 거칩니다.
Autofix는 다음과 같은 경우에 가장 효과적입니다:
- 삽입 위험 또는 안전하지 않은 API 사용과 같은 일반적인 취약성 패턴입니다.
- 명확하고 지역화된 코드 변경으로 해결할 수 있는 문제입니다.
더 복잡한 문제의 경우 Autofix가 지침을 제공할 수 있지만 수정을 수정하거나 사용자 지정 솔루션을 구현해야 할 수 있습니다.
경고의 제안된 수정 사항
Autofix를 사용할 수 없는 경우에도 일부 경고에는 제안된 수정 사항이 포함됩니다.
다음 제안 사항:
- 변경해야 하는 코드 부분을 강조 표시합니다.
- 문제를 해결하는 방법에 대한 지침을 제공합니다.
수정 사항을 작성할 때 이러한 제안을 시작점으로 사용할 수 있습니다.
Dependabot을 사용하여 종속성 수정
모든 취약성이 코드에서 오는 것은 아닙니다. 일부는 종속성을 통해 도입됩니다.
Dependabot은 다음을 통해 이러한 문제를 자동으로 해결하는 데 도움이 됩니다.
- 취약한 종속성 검색
- 업데이트된 버전을 사용하여 끌어오기 요청을 만듭니다.
- 수정 사항을 검토하고 병합할 수 있습니다.
이러한 끌어오기 요청은 Autofix와 동일한 워크플로를 따릅니다.
- 변경이 제안됩니다.
- 검사가 실행됩니다.
- 업데이트가 검토된 후 병합됩니다.
따라서 종속성 수정은 애플리케이션 코드 문제를 해결하는 방법과 일치합니다.
수정 워크플로 자동화
GitHub Actions 사용하여 수정을 처리하는 방법을 자동화할 수 있습니다.
예를 들어 워크플로는 다음을 수행할 수 있습니다.
- Autofix 또는 Dependabot 끌어오기 요청에서 테스트를 실행합니다.
- 심각도에 따라 레이블을 적용합니다.
- 고위험 변경에 대한 승인이 필요합니다.
- 위험 수준이 낮은 업데이트를 자동으로 병합합니다.
이러한 워크플로는 수정이 다음과 같은지 확인합니다.
- 팀 전체에서 일관됩니다.
- 병합하기 전에 유효성이 검사되었습니다.
- 개발 프로세스에 통합됩니다.
탐지에서 해결까지
전체 워크플로에서 다음을 수행합니다.
- CodeQL은 취약성을 검색합니다.
- Copilot Autofix가 수정 방법을 제안합니다.
- 끌어오기 요청이 만들어집니다.
- GitHub Actions 변경의 유효성을 검사합니다.
- 수정 사항이 검토되었고 병합되었습니다.
CodeQL 분석을 Copilot Autofix, Dependabot 및 워크플로 자동화와 결합하여 문제를 찾을 뿐만 아니라 효율적으로 해결하는 데 도움이 되는 시스템을 만듭니다.
코드 검사 경고에 조치하기
리포지토리에서 코드를 확인하도록 코드 검사를 설정할 수 있습니다. 기본 CodeQL 분석, 타사 분석 또는 기타 유형의 분석을 사용할 수 있습니다. 결과 경고는 리포지토리에 나란히 표시됩니다.
GitHub의 기본 CodeQL 분석에는 비 Microsoft 도구 또는 사용자 지정 쿼리의 결과보다 경고에 대한 속성이 더 많이 포함될 수 있습니다. 기본 워크플로에서는 코드 스캐닝이 기본 브랜치에서 주기적으로, 그리고 끌어오기 요청 시에 코드를 분석합니다.
각 경고에는 다음 정보가 포함됩니다.
- 코드를 식별한 도구의 이름 및 코드와 관련된 문제입니다.
- 경고를 트리거한 코드 줄입니다.
- 심각도와 같은 경고의 속성입니다.
- 보안 심각도입니다.
- 문제가 도입된 시점입니다.
- 문제의 본질입니다.
정보에는 CodeQL 분석에서 경고를 식별할 때 문제를 해결하는 방법도 포함됩니다. 또한 CodeQL을 통한 코드 검색은 코드에서 데이터 흐름 문제를 검색할 수 있습니다.
수동으로 취약성을 수정하는 것 외에도 Dependabot 보안 업데이트를 사용하여 종속성 수정을 자동화할 수 있습니다.
Dependabot이 취약한 종속성을 감지하면 종속성을 업데이트하는 끌어오기 요청을 만듭니다. 이러한 끌어오기 요청을 자동화된 워크플로에 통합하여 수정을 간소화할 수 있습니다.
Dependabot을 사용하여 종속성 수정 자동화
일반적인 자동화 워크플로는 다음 패턴을 따릅니다.
- Dependabot은 취약한 종속성을 업데이트하는 끌어오기 요청을 만듭니다.
- GitHub Actions 워크플로는 이벤트에서 트리거됩니다
pull_request. - 워크플로는 풀 리퀘스트가
dependabot[bot]에 의해 생성되었는지 확인합니다. - 업데이트에 대한 메타데이터(예: 종속성 유형 또는 버전 변경)를 사용하여 다음 작업을 확인할 수 있습니다.
- 워크플로는 유효성 검사를 실행하거나, 레이블을 적용하거나, 위험 수준이 낮은 업데이트에 대해 자동 병합을 사용하도록 설정합니다.
다음 예제에서는 Dependabot 끌어오기 요청에 대해서만 실행되는 간단한 GitHub Actions 워크플로를 보여 줍니다. 업데이트의 유효성을 검사하고 검사 통과 후 자동 병합을 사용하도록 설정할 수 있습니다.
name: Dependabot remediation
on:
pull_request:
branches:
- main
permissions:
pull-requests: write
jobs:
dependabot:
if: github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: npm test
- name: Enable auto-merge for approved updates
if: ${{ success() }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ github.event.pull_request.html_url }}
run: gh pr merge --auto --merge "$PR_URL"
이 방법을 사용하면 팀이 수동 작업을 줄이면서 병합하기 전에 종속성 업데이트의 유효성을 검사할 수 있습니다.
프로덕션 시나리오에서 자동 병합은 일반적으로 패치 릴리스와 같은 위험 수준이 낮은 업데이트로 제한되며 분기 보호 규칙, 필수 상태 검사 및 검토 정책과 결합됩니다.
수정 활동에 대해 팀에게 알립니다.
종속성 업데이트에 대한 가시성을 향상시키기 위해 팀은 종종 Dependabot을 외부 알림 시스템과 통합합니다.
GitHub 알림 외에도 다음을 사용할 수 있습니다.
- 팀 인식을 위한 Slack 또는 Microsoft Teams 통합
- 사용자 지정 통합 및 자동화 파이프라인용 GitHub 웹후크.
예를 들어 워크플로 또는 웹후크는 다음과 같은 경우 팀에 알릴 수 있습니다.
- Dependabot 끌어오기 요청이 열립니다.
- 유효성 검사에 실패합니다.
- 보안 업데이트가 병합됩니다.
이러한 알림은 수정에 주의가 필요한 경우 팀이 신속하게 응답하는 데 도움이 됩니다.
데이터 흐름 경고
데이터 흐름 분석은 다음을 포함하여 코드에서 잠재적인 보안 문제를 찾습니다.
- 보안을 손상시키는 방식으로 데이터를 사용합니다.
- 함수에 위험한 인수 전달
- 중요한 정보 유출.
GitHub는 코드 검사에서 데이터 흐름 경고를 보고할 때 코드에서 데이터가 이동하는 방식을 보여 줍니다. 이러한 데이터 흐름 경고를 사용하여 중요한 정보를 유출하는 코드 영역을 식별할 수 있습니다. 이 지식은 악의적인 사용자의 공격에 대한 진입점을 식별하는 데 도움이 될 수 있습니다.
심각도 수준
오류의 심각도가 있는 모든 코드 검색 결과에서는 기본적으로 검사 실패가 발생합니다.
경고 심각도 수준은 다음과 같습니다.
- 오류
- Warning
- Note
코드 검색 경고를 트리거하는 끌어오기 요청이 실패할 심각도 수준을 지정할 수 있습니다.
보안 심각도 수준
코드 검색에서 생성하는 보안 쿼리는 경고에 대한 보안 심각도 수준을 표시합니다.
보안 심각도 수준은 다음과 같습니다.
- 긴급
- 높음
- 중간
- 낮음
GitHub는 CVSS(Common Vulnerability Scoring System) 데이터를 사용하여 경고의 보안 심각도를 계산합니다.
보안 심각도가 Critical 또는 High인 모든 코드 스캔 결과는 기본적으로 검사 실패를 일으킵니다. 코드 검사 결과에 대한 검사 실패를 발생시킬 보안 심각도 수준을 지정할 수 있습니다.
코드 검색 경고 닫기
다음과 같은 두 가지 방법으로 경고를 닫을 수 있습니다.
- 코드에서 문제를 해결합니다.
- 경고를 해제하거나 삭제합니다.
코드 검색 경고 해제
경고를 해제하는 것은 수정할 필요가 없다고 생각되는 경고를 종료하는 방법입니다. 예를 들어 테스트에만 사용되는 코드의 오류에 대한 경고를 해제할 수 있습니다. 오류를 수정하는 데 필요한 노력이 코드 개선의 잠재적 이점보다 큰 경우 경고를 해제할 수도 있습니다.
코드의 코드 검색 주석이나 보안 탭의 요약 목록에서 경고를 해제할 수 있습니다. 목록에서 경고를 해제하려면 경고 해제 메뉴를 선택하고 해제 이유를 선택한 다음 경고 해제 단추를 선택합니다.
경고를 해제하는 경우:
- 경고는 모든 지점에서 해제됩니다.
- 경고가 프로젝트에 대한 현재 경고 수에서 제거됩니다.
- 경고는 경고 요약에서 닫힌 목록으로 이동합니다. 필요한 경우 여기에서 다시 열 수 있습니다.
- 경고를 종결한 이유가 기록됩니다.
- 다음에 코드 검색이 실행되면 동일한 코드가 경고를 생성하지 않습니다.