공격자가하기 전에 Github Actions 작업 플로우 주입을 잡는 방법
코드를 작성하고 프로젝트를 유지할 때 보안이 명심해야한다는 것을 이미 알고 있습니다. 확률은 또한 프로젝트가 끝날 때 보안을 짜내려고하지 않고 처음부터 보안에 대해 생각하는 것이 훨씬 쉽다는 것을 알고 있습니다.
그러나 GitHub Action 주입은 GitHub 리포지토리에 저장된 프로젝트에서 가장 일반적인 취약점 중 하나라는 것을 알고 있습니까? 고맙게도, 이것은 비교적 쉽게 다루기 쉬운 취약점이며, Github에는 훨씬 쉽게 도구를 제공 할 수있는 도구가 있습니다.

보안 사고 방식을 수용합니다
진실은 보안은“완료된”것이 아니라는 것입니다. 코드를 안전하고 안전하게 유지하기 위해 계속 집중 해야하는 지속적인 프로세스입니다. 자동화 된 도구는 큰 도움이되지만 올인원의 화재 및 포트 솔루션이 아닙니다.
그렇기 때문에 보안 취약점의 원인과 해결 방법을 이해하는 것이 중요합니다. 도구는 100% 효과적이지 않지만 이해를 높이고 지식을 심화시켜 위협에 더 잘 대응할 수 있습니다.
이를 염두에두고 Github 리포지토리에서 발견 된 가장 일반적인 취약점 중 하나에 대해 이야기 해 봅시다.
작업 플로우 주입 설명
그렇다면 Github Actions 워크 플로 주입은 정확히 무엇입니까? 악의적 인 공격자가 저장소에서 워크 플로에서 실행되는 명령을 제출할 수있는 경우입니다. 이는 공격자가 문제 제목 또는 지점 이름을 생성 할 때와 같은 데이터를 제어하고 신뢰할 수없는 입력을 실행할 때 발생할 수 있습니다. 예를 들어, 워크 플로의 실행 부분에서 실행할 수 있습니다.
이것의 가장 일반적인 원인 중 하나는 ${{}}
코드의 구문. 전처리 단계 에서이 구문은 자동으로 확장됩니다. 이 확장은 새 명령을 삽입하여 코드를 변경할 수 있습니다. 그런 다음 시스템이 코드를 실행하면 이러한 악성 명령도 실행됩니다.
예를 들어 다음 워크 플로를 고려하십시오.
- name: print title
run: echo "${{ github.event.issue.title }}"
사용자가 문제를 생성 할 때 마다이 워크 플로가 트리거되었다고 가정 해 봅시다. 그런 다음 공격자는 제목에서 악성 코드로 문제를 생성 할 수 있으며이 워크 플로우가 실행될 때 코드가 실행됩니다. 공격자는 제목에 백틱 문자를 추가하는 것과 같은 소량의 속임수 만 수행하면됩니다. touch pwned.txt
. 또한이 코드는 워크 플로에 부여 된 권한을 사용하여 실행되며 공격자가 가질 가능성은 거의 없습니다.
이것이 작업 플로우 주입의 근본입니다. 행동 워크 플로 주입과 관련된 가장 큰 문제는 이것이 문제라는 인식 이며이 취약점으로 이어질 수있는 모든 사례를 찾는 것입니다.
코드를 사전에 보호하는 방법
앞서 언급했듯이, 취약성이 사실 이후에 잡는 것보다 취약성이 나타나는 것을 방지하는 것이 더 쉽습니다. 이를 위해 행동 워크 플로 주입로부터 자신을 보호하기 위해 코드를 작성하는 동안 명심해야 할 몇 가지 사항이 있습니다.
이것들은 귀중한 팁이지만,이 모든 지침을 따르더라도 완전히 보호된다는 것을 보장하지는 않습니다.
환경 변수를 사용합니다
작업 플로우 주입은 신뢰할 수없는 입력으로 취급해야 할 사항을 확장 한 결과 발생합니다. 워크 플로에 삽입되면 악성 코드가 포함 된 경우 의도 된 동작이 변경됩니다. 그런 다음 워크 플로우가 트리거되고 실행되면 공격자의 코드가 실행됩니다.
한 가지 해결책은 사용하지 않는 것입니다 ${{}}
워크 플로 섹션의 구문 run
. 대신, 신뢰할 수없는 데이터를 환경 변수로 확장 한 다음 워크 플로를 실행할 때 환경 변수를 사용하십시오. 위의 예를 고려하면 다음으로 변경됩니다.
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
이로 인해 입력을 신뢰할 수는 없지만 공격자 가이 취약점을 활용할 수있는 몇 가지 방법으로부터 귀하를 보호하는 데 도움이됩니다. 우리는 당신이 이것을하도록 권장하지만,이 데이터는 신뢰할 수없고 잠재적 인 위험이 될 수 있음을 여전히 기억합니다.
최소한의 특권의 원칙은 가장 친한 친구입니다
조치 워크 플로우 주입이 트리거되면 워크 플로에 부여 된 권한이 있습니다. 워크 플로의 github_token에 대한 권한을 설정하여 워크 플로우가 가지고있는 권한을 지정할 수 있습니다. 이러한 이유로, 워크 플로가 업무를 수행하기 위해 필요한 최저 권한 수준 만으로만 실행되는지 확인하는 것이 중요합니다. 그렇지 않으면, 당신은 그들이 코드를 워크 플로에 주입 할 경우 의도하지 않은 공격자 권한을 부여 할 수 있습니다.
조심하십시오 pull_request_target
트리거 된 워크 플로에서 주입이 발생할 때 일반적으로 영향이 훨씬 더 파괴적입니다. pull_request_target
보다 pull_request
. 사이에는 큰 차이가 있습니다 pull_request
그리고 pull_request_target
워크 플로 트리거.
그만큼 pull_request
워크 플로 트리거는 포크에서 트리거 될 때 기본적으로 대상 저장소의 쓰기 권한 및 비밀 액세스를 방지합니다. 워크 플로가 동일한 저장소의 지점에서 트리거되면 비밀에 액세스 할 수 있으며 잠재적으로 쓰기 권한이 있습니다. 무단 액세스를 방지하고 저장소를 보호하기 위해이를 수행합니다.
대조적으로 pull_request_target
워크 플로 트리거는 워크 플로 작가에게 일부 제한을 해제 할 수있는 기능을 제공합니다. 이것은 일부 시나리오에서 중요하지만 사용함으로써 pull_request_target
대신 pull_request
당신은 잠재적으로 저장소를 더 큰 위험에 처하게하고 있습니다.
이것은 당신이 그것을 사용해야한다는 것을 의미합니다 pull_request
사용해야 할 필요가없는 한 트리거 pull_request_target
. 후자를 사용하는 경우 추가 권한이 주어지면 워크 플로를 추가로주의를 기울이려고합니다.
문제는 메인에만 있지 않습니다
코드를 개발하는 동안 여러 가지 기능이나 버그 수정을 위해 여러 지점을 만드는 것은 드문 일이 아닙니다. 이것은 소프트웨어 개발주기의 정상적인 부분입니다. 그리고 때로는 합병 후 또는 그와 함께 작업을 마친 후에 그 지점을 닫고 삭제하는 것을 기억하는 것이 최고가 아닙니다. 불행히도,이 지점은 사용하는 경우 여전히 잠재적 인 취약점입니다. pull_request_target
방아쇠.
공격자는 지점의 풀 요청에서 실행되는 워크 플로를 타겟팅 할 수 있으며 여전히이 악용을 활용할 수 있습니다. 이것은 당신이 당신의 저장소가 당신에 대한 워크 플로우이기 때문에 안전하다고 가정 할 수 없다는 것을 의미합니다. main
지점은 안전합니다. 저장소에서 공개적으로 볼 수있는 모든 지점을 검토해야합니다.
CodeQL이 테이블에 가져 오는 것
CodeQL은 코드에 대해 자동화 된 보안 검사를 제공하는 GitHub의 코드 분석 도구입니다. 여기서 가장 관련성이 높은 CodeQL의 특정 기능은 코드 스캔 기능으로 코드에 대한 피드백을 제공하고 잠재적 인 보안 취약점을 식별하는 데 도움이 될 수 있습니다. 최근에 GitHub Actions 작업 플로우 파일을 일반적으로 사용할 수 있었으며이 기능을 사용하여 잠재적 작업 워크 플로우 주입 위험과 같은 여러 유형의 취약점을 찾을 수 있습니다.
CodeQL이 신뢰할 수없는 데이터가 사용될 수있는 위치를 찾는 데 능숙한 이유 중 하나는 오염 된 추적 때문입니다. 작년 말 작업을 위해 CodeQL에 오염 추적을 추가했습니다. Taint 추적을 통해 CodeQL은 신뢰할 수없는 데이터가 코드를 통해 흐르고 이전 예제만큼 명확하지 않은 잠재적 위험을 식별하는 경우를 추적합니다.
CodeQL을 사용하여 작업 플로우를 스캔 할 수있는 작업 플로우는 기본 설정으로 CodeQL Code 스캔을 활성화하는 것만 큼 쉽습니다. 기본 설정으로 작업 워크 플로 분석을 자동으로 포함하고 보호 된 분기에서 실행됩니다. 그런 다음 코드 스캔 결과를 확인하여 잠재적 위험을 식별하고 수정을 시작할 수 있습니다.
CodeQL의 고급 설정을 이미 사용하고 있다면 actions
대상 언어에 대한 언어. 이러한 스캔은 앞으로 수행되며 이러한 취약점을 식별하는 데 도움이됩니다.
이 블로그에서는 들어 가지 않을 것이지만 CodeQL Code Scanning이 여러 쿼리를 실행한다는 것을 아는 것이 중요합니다. 작업 플로우 주입을 찾는 데 능숙하지 않습니다. 우리는 당신이 그것을 시도하고 그것이 무엇을 찾을 수 있는지 확인하도록 권장합니다.
CodeQL은 매우 효과적인 도구 이며이 특정 취약점을 찾는 데 실제로 능숙하지만 여전히 100% 효과적이지 않을 것입니다. 도구는 완벽하지 않으며 보안 사고 방식을 유지하고 자신의 코드에 비판적인 아이디어를 얻는 데 집중해야합니다. 이것을 생각의 최전선에 유지함으로써보다 안전한 코드를 개발하고 이러한 취약점이 처음부터 나타나는 것을 방지 할 수 있습니다.
미래의 단계
조치 워크 플로 주입은 GitHub에서 사용 가능한 저장소에서 가장 널리 퍼진 취약점 중 하나로 알려져 있습니다. 그러나 그들은 비교적 쉽게 해결하기 쉽습니다. 이 취약점을 제거하는 데있어 가장 큰 문제는 단순히 문제가 있다는 것을 알고 코드에서 가능한 약점을 발견하는 것입니다.
이제 문제를 알고 있으며 CodeQL을 유용한 도구로 사용하므로 자신의 코드에서 이러한 취약점을 찾고 수정할 수 있어야합니다. 그리고 사전 조치를 염두에두면 향후 코드에서 발생하지 않도록 더 나은 위치에있을 것입니다.
Actions Workflow 주입에 대해 더 많이 배우려면 이전에 작업 워크 플로를 안전하게 유지하는 방법에 대한 4 부 시리즈를 게시했습니다. 두 번째 부분은 특히 작업 워크 플로 주입에 관한 것이지만 전체 시리즈를 읽는 것이 좋습니다.
잠재적 인 취약점을 찾기 위해 코드를 검색하는 데 도움이 필요하십니까? 오늘 프로젝트에서 코드 스캔을 설정하십시오.
작성자가 작성했습니다
Post Comment