(2021년 7월에 작성했던 발표자료)
📰 소스 코드를 통한 Credential 유출 피해 사례
- 암호 화폐 거래소의 API key를 다량으로 확보하여 가격 폭등/폭락을 일으켜 이득을 취함
https://cybernews.com/security/report-how-cybercriminals-abuse-api-keys-to-steal-millions/
- 병원 Database 접근 credential이 GitHub을 통해 유출되어 유명 정치인을 포함한 환자 정보 유출
https://www.zdnet.com/article/personal-data-of-16-million-brazilian-covid-19-patients-exposed-online/ - AI pair programmer인 Copilot이 API Key마저 자동완성 한다는 report
https://fossbytes.com/github-copilot-generating-functional-api-keys/
🤭 여전히 GitHub에 등장하는 Credential들
- https://github.com/search
- keyword 기반 검색
- pattern 기반 검색
- 자동화 가능: GitHub의 검색 API를 통한 1차 filtering + 로컬에서 정규식 적용 검색으로 2차 filtering
- 같은 실수를 반복하는 인간 - 유출된 credential 근처 코드를 확인해 보면 또 다른 종류의 credential을 발견하는 경우가 많음
🔍 Credential Scanner
소스 코드를 Scan하여 Credential일 가능성이 높은 것을 찾아내는 도구
Regular expression 규칙을 정의하고, 그 규칙에 맞는 string을 찾는 방식을 주로 취한다
rules = {
"Slack Token": "(xox[p|b|o|a]-[0-9]{12}-[0-9]{12}-[0-9]{12}-[a-z0-9]{32})",
"RSA private key": "-----BEGIN RSA PRIVATE KEY-----",
"SSH (OPENSSH) private key": "-----BEGIN OPENSSH PRIVATE KEY-----",
"SSH (DSA) private key": "-----BEGIN DSA PRIVATE KEY-----",
"SSH (EC) private key": "-----BEGIN EC PRIVATE KEY-----",
"PGP private key block": "-----BEGIN PGP PRIVATE KEY BLOCK-----",
"Facebook Oauth": "[f|F][a|A][c|C][e|E][b|B][o|O][o|O][k|K].{0,30}['\"\\s][0-9a-f]{32}['\"\\s]",
"Twitter Oauth": "[t|T][w|W][i|I][t|T][t|T][e|E][r|R].{0,30}['\"\\s][0-9a-zA-Z]{35,44}['\"\\s]",
"GitHub": "[g|G][i|I][t|T][h|H][u|U][b|B].{0,30}['\"\\s][0-9a-zA-Z]{35,40}['\"\\s]",
"Google Oauth": "(\"client_secret\":\"[a-zA-Z0-9-_]{24}\")",
"AWS API Key": "AKIA[0-9A-Z]{16}",
"Heroku API Key": "[h|H][e|E][r|R][o|O][k|K][u|U].{0,30}[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}",
"Generic Secret": "[s|S][e|E][c|C][r|R][e|E][t|T].{0,30}['\"\\s][0-9a-zA-Z]{32,45}['\"\\s]",
"Generic API Key": "[a|A][p|P][i|I][_]?[k|K][e|E][y|Y].{0,30}['\"\\s][0-9a-zA-Z]{32,45}['\"\\s]",
"Slack Webhook": "https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24}",
"Google (GCP) Service-account": "\"type\": \"service_account\"",
"Twilio API Key": "SK[a-z0-9]{32}",
"Password in URL": "[a-zA-Z]{3,10}://[^/\\s:@]{3,20}:[^/\\s:@]{3,20}@.{1,100}[\"'\\s]",
"SlackInternal": "slack-corp",
}
출처: https://github.com/trufflesecurity/truffleHog/blob/dev/scripts/searchOrg.py
주요 Credential Scanner
- Open source
- Non-open source
구분 특징
- 소스 코드 위치
- Local에 있는 코드를 스캔
$ gitleaks --path=path/to/local/repo - GitHub, GitLab 같이 Online에 있는 코드를 스캔
$ python -m credentialdigger scan https://github.com/user/repo
- Local에 있는 코드를 스캔
- Scan 위치
- 로컬 자원을 사용하여 스캔
— Repository 크기가 커질수록 자원 부담이 커진다 - 스캐닝 서버를 제공
— Non-open source 서비스들의 방식. 유료인 경우가 많음
— 소스 코드 유출이 걱정되는 사용자에게는 부적절
- 로컬 자원을 사용하여 스캔
- Historical scan
- 현재 상태 (Branch의 HEAD) 만 스캔
- Branch의 commit history까지 전부 스캔
- 배포 방식
- source code
- executable
- python library
- docker
- web service
- Customizing - 스캔할 규칙, 예외 규칙을 사용자가 설정할 수 있는지
- Open source scanner들이 자유도가 높은 편
- Output format
- JSON 과 같은 텍스트 파일
— 자체적으로 parsing하여 분석하기 용이함 - sqlite db 파일
— table에 바로 query를 호출하여 분석하기 용이함 - 웹 뷰
—예쁨— 위험도에 따라 highlight color를 다르게 주는 등, 개발자가 빠른 판단을 하기에 좋은 방식
- JSON 과 같은 텍스트 파일
❌ 오탐은 개발자를 귀찮게 해
- token, secret 이라는 변수에 대입만 하면 무조건 탐지
- Test code에 있는 가짜 credential 탐지
- Placeholder 탐지
오탐을 줄이기 위한 연구
- Path 분석
Code 내용 뿐 아니라 file path도 분석하여, test, node_modules, venv, example이 포함되어 있으면 탐지하지 않거나 경고 단계를 낮춘다 - Allowlist
널리 알려진 example credential은 allowlist로 관리하여 탐지하지 않는다 - Validation
여전히 활성화된 credential 인지를 credential 제공자 (AWS, Google 등)에게 확인하는 과정
https://gitlab.com/gitlab-com/gl-security/security-operations/gl-redteam/secrets-hunting-misc
범죄가 되지 않도록 잘 해야 한다.. - Code flow 분석
a = "dkan/rmfwk_melon" ... PASSWORD = a ... some_api.call(pw=PASSWORD)
이 때 a가 credential임을 탐지할 수 있게 한다
연구에 따라서는 AST까지 그리기도 하는데, 언어마다 compiler가 필요하고 분석 시간이 오래 걸린다는 단점이 있다 - AI support
- (논문) Secrets in Source Code: Reducing False Positives using Machine Learning
https://ieeexplore.ieee.org/abstract/document/9027350
코드에 특정 문자가 있는지, 20여가지 feature를 도출하고 직접 labeling하여 traditional machine learning 기법(combination of Logistic Regression, Naïve Bayes and SVM)으로 학습시킴 - (특허) Cleartext password detection using machine learning
https://patents.google.com/patent/US10762192B2/en
Word embedding (e.g. Word2Vec)을 사용하여, 등장할 확률이 낮은 문자가 등장하는 경우에 password일 가능성을 높게 보겠다는 기조
- (논문) Secrets in Source Code: Reducing False Positives using Machine Learning
🔑 (개발자가 실제로 가장 많이 접할) GitHub의 Secret Scanning
GitHub은 public repository에 대해서 수 년 전부터 이메일 경고 서비스를 제공해 왔음
출처: https://www.youtube.com/watch?v=aoL7pDrXt74
2020년도 GitHub 행사에서 두 차례 소개된 Secret Scanning 기능
https://www.youtube.com/watch?v=aoL7pDrXt74
https://www.youtube.com/watch?v=oaHBW9Il4Wg
2021년 4월 1일, private repository에 대해서도 정식 지원 시작 (링크) (유료)
설정 방법 (링크)
🐕🦶개발자는 무얼 하면 좋을까
- Pre-commit hook 사용
Pre-commit hook으로 설정하여 local에서 commit 시 credential이 포함되지 못하게 한다.
Remote repository upload를 원천차단 하는데 효과적임 - CI 에 적용
- CI에서 원하는 credential scanner를 세팅하여 검사
- GitHub의 secret scanning 옵션을 사용
- 유료 서비스에 repository 등록
- 하지만 이미 repository에 올라간 지 오래라면.. 😢
- https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
- Credential을 폐기하는 것이 간편하다
- git filter-branch (링크)
브랜치를 재정의하는 기능
필터를 정의하고 정의한 필터에 커밋을 통과시켜 새로운 커밋으로 변경해준다 - BFG repo cleaner (링크)
삭제 기능에 집중한 서비스
git filter-branch에 비해 제공 기능은 적지만 속도가 빠르다고 한다
'개발 이야기' 카테고리의 다른 글
"한 권으로 배우는 도커 & 쿠버네티스" 도서 리뷰 (30) | 2024.11.25 |
---|---|
"차세대 빅데이터 플랫폼 Data Lake" 도서 리뷰 (15) | 2024.11.14 |
Docker container에서 cronjob이 trigger되지 않던 문제 해결 (0) | 2024.08.01 |
Clickhouse 데이터 파일 깨짐 현상 복구 (0) | 2024.06.27 |
superset 설치 troubleshooting (3) | 2024.05.21 |