Skip to content

보안 취약점 스캐닝

보안 취약점 관리에 신경쓰지 않던 조직에서 갑자기 보안에 대한 검토를 이야기하고 있어요. 아무래도 개인정보 유출에 대한 뉴스가 많이 공유되다보니 뒤늦게 걱정되나 보네요. 아무튼, 개발자 입장에서 애플리케이션에 대한 보안 취약점을 스캐닝하는 방안에 대해서 알아본 것을 정리해봅니다.

SBOM(Software Bill of Materials)

SBOM은 애플리케이션 제품에서 사용된 오픈소스 라이브러리나 패키지에 대한 정보를 포함하고 있는 국제 표준 포맷이래요. 그래서 특정 오픈소스 라이브러리나 패키지에 대한 보안 취약점이 공개되었을때 우리 애플리케이션에 영향을 미치는지 빠르게 확인할 수 있다고 해요.

Google OSV Scanner와 같은 보안 취약점 분석 도구들은 이 SBOM 정보를 스캐닝해서 보안 데이터베이스에 포함된 취약점을 감지해요.

Github Dependabot

깃허브에서 제공하는 Github Dependabot 에서는 package-lock.json 과 gradle.lockfile 같은 의존성 그래프 정보들을 토대로 GitHub Advisory Database에 등록된 취약점이 의존성에 포함되어 있는지 알려주고 있어요.

Github Dependabot 설정

오히려 알려주는게 과도하다며 Dependabot을 끄자라는 글도 보입니다.

CVE (Common Vulnerabilities and Exposures)

Dependabot alerts 로 감지된 항목을 살펴보면 CVE ID가 있는 걸 볼 수 있을거에요. 이 CVE-YYYY-NNNNN는 공개적으로 알려진 보안 취약점에 대해서 할당한 식별 번호를 의미해요. CVSS (Common Vulnerability Scoring System)라는 보안 점수가 매겨지는데 React2Shell처럼 10점에 가까울수록 치명적인 취약점을 의미해요. 다만, 10점인 취약점이라고 해서 모든 애플리케이션 환경에 영향을 미친다는 의미는 아니에요.

개발자의 보안 취약점 분석

Github Dependabot 가 아니더라도 사실 우리가 사용하고 있는 인텔리제이나 VSCode 같은 도구들에서 보안 취약점을 분석할 수 있는 기능은 충분히 제공하고 있어요. 그냥 우리와 같은 개발자들이 신경써서 사용하지 않았을 뿐인 거죠. 이제는 바이브 코딩으로 상세한 코드를 직접 보지 않을 가능성인 높기 때문에 더욱 이 코드 분석 결과를 보고 수정할 기회는 적어졌어요.

SonarLint(SonarQube for IDE)

정적 분석(SAST)은 애플리케이션 소스 코드를 분석해서 취약한 코드나 보안 문제를 찾아내는 화이트박스 테스트에요. 회사에서 인텔리제이를 사용하고 있다면 SonarQube 에서 제공하는 SonarLint 를 사용해서 코드 작성과 동시에 보안 취약점을 체크할 수 있어요. 사실은 인텔리제이 자체적으로 Qodana 를 통해 정적 코드 분석 결과를 제시해주고 있어요.

SonarLint 경고 예시

IntelliJ Qodana 분석 결과

OSV Scanner

OWASP Dependency-Check가 있긴하지만 NVD 데이터베이스를 다운받지 않으려면 API 를 발급받는 절차를 거쳐야하므로 구글이 만들어서 공개한 OSV Scanner 를 사용해서 OSV (Open Source Vulnerability) 데이터베이스를 토대로 취약점을 분석하고 추출하는 방법에 대해서 알아보려고 해요.

sh
# winget install Google.OSVScanner
brew install osv-scanner
sh
osv-scanner --lockfile=/path/to/package-lock.json # Node.js
osv-scanner --lockfile=/path/to/requirements.txt # Python
sh
# build.gradle
dependencyLocking {
    lockAllConfigurations()
}
./gradlew dependencies --write-locks
osv-scanner --lockfile=/path/to/gradle.lockfile
sh
osv-scanner scan source -r /path/to/your/project

DAST Scanner ㅡ OWASP ZAP

동적 분석(DAST)은 스테이징 환경에서 애플리케이션이 최종 실행된 상태로 외부 호출을 통해 취약점을 발견하는 블랙박스 테스트에요. DAST 스캐너는 실제 요청이기 때문에 프로덕션 환경에서 수행하는 건 적합하지 않아요. 공공기관 처럼 중요한 서비스에는 HCL AppScan 이라는 상용 솔루션을 도입하는 것 같지만 비용 문제로 OWASP ZAP와 같은 오픈소스 도구를 찾는 것 같아요. 회사 조직에서는 이 도구를 통해 파트너 고객사에게 보안 점검에 대한 보고서를 만들어서 공유할 생각인 것 같아요.

Container Vulnerability Scanning ㅡ Clair

이제는 클라우드 서비스 환경을 이용할 때 컨테이너 기반 기술을 이용하려는 경우가 대부분이지 않을까 싶은데요. Amazon ECR 에서도 기본적으로 Clair 를 사용해서 이미지 스캐닝하여 분석해주고 있다고 해요. 클라우드 서비스에서 제공해주지 않는다면 (안전하지 않은 상황이 있긴 했지만) Trivy처럼 컨테이너 이미지에 대한 취약점을 스캐닝하는 오픈소스 도구를 이용해볼 수 있을 것 같아요.

의존성 취약점을 분석해보았던 OSV Scanner 에서도 이미지 분석을 지원하고 있긴 합니다.

마치며

지금까지 의존성 스캐닝(SCA)부터 정적 분석(SAST), 동적 분석(DAST), 그리고 컨테이너 이미지 스캐닝까지 다양한 취약점 보안 스캐닝 방안을 알아봤어요.

그동안 보안 취약점 관리에 소홀했다가 갑자기 거창한 보안 관리 프로세스를 정착시키는 건 현실적으로 불가능에 가까워요. 당장은 로컬 IDE에 플러그인을 설치해 경고를 눈에 익히거나, Github Dependabot을 활성화해 탐지되는 경고들을 하나씩 줄여나가는 게 현실적이에요.

Released under the MIT License.