상세 컨텐츠

본문 제목

🧱 튼튼한 집도 주춧돌이 썩었다면? OWASP A9:2017 - 알려진 취약점이 있는 구성요소 사용

IT보안

by gasbugs 2025. 8. 16. 12:06

본문

반응형

안녕하세요! 👋 현대적인 웹 개발의 빛과 그림자를 탐색하는 여러분, 오늘은 2017년 OWASP Top 10에서 9위를 차지한, 어쩌면 가장 광범위하게 우리를 위협하는 A9: 알려진 취약점이 있는 구성요소 사용(Using Components with Known Vulnerabilities)에 대해 알아보겠습니다.

 

https://github.com/OWASP-Seoul/owasp/raw/master/OWASP%20Project/OWASP_Top_10-2017-ko.pdf

 

우리가 직접 만든 코드는 완벽할지 몰라도, 우리가 가져다 쓴 '부품'에 문제가 있다면 어떻게 될까요? 마치 최고급 자재로 지은 건물이라도, 썩은 주춧돌을 사용했다면 순식간에 무너질 수 있는 것과 같습니다. 이 위험한 '썩은 주춧돌' 문제를 함께 살펴보시죠! 🏛️


🤔 '알려진 취약점이 있는 구성요소'란 무엇인가요?

현대의 소프트웨어 개발은 '바퀴를 재발명'하지 않습니다. 로그인, 암호화, UI 구성 등 필요한 기능이 있다면, 이미 잘 만들어진 오픈소스 라이브러리, 프레임워크, 모듈과 같은 구성요소(Component)를 가져와 조립하는 방식으로 이루어집니다. 이는 개발 속도를 획기적으로 높여주는 매우 효율적인 방법이죠. 🚀

 

문제는 우리가 사용하는 이 수많은 외부 구성요소들 역시 하나의 소프트웨어라는 점입니다. 즉, 이 구성요소들에도 버그나 보안 취약점이 존재할 수 있습니다.

 

'알려진 취약점이 있는 구성요소 사용'은 바로 이러한 보안 결함이 이미 공개된(알려진) 구성요소를, 개발자가 모르고 사용하거나 알면서도 패치하지 않은 채로 방치했을 때 발생하는 취약점입니다.

 

공격자들은 항상 이런 '알려진' 취약점을 노립니다. 특정 라이브러리의 몇 번 버전에 어떤 취약점이 있는지 공개적으로 데이터베이스(CVE 등)에 등록되기 때문에, 공격자는 해당 버전의 라이브러리를 사용하는 시스템을 찾아내기만 하면 아주 손쉽게 공격을 성공시킬 수 있습니다. 🎯


실제 사례: 거대 기업을 무너뜨린 작은 부품

이 취약점의 파급력을 보여주는 가장 유명한 사례는 2017년 미국의 신용정보 회사 에퀴팩스(Equifax) 개인정보 유출 사건입니다.

  1. 원인: 웹 프레임워크인 아파치 스트럿츠(Apache Struts) 2에서 심각한 원격 코드 실행 취약점(CVE-2017-5638)이 발견되고 즉시 보안 패치가 배포되었습니다.
  2. 상황: 에퀴팩스는 자사 시스템에서 이 취약한 버전의 아파치 스트럿츠 2를 사용하고 있었지만, 두 달이 넘도록 패치를 적용하지 않았습니다.
  3. 결과: 공격자들은 이 '알려진 취약점'을 이용해 서버에 침투했고, 무려 1억 4,700만 명의 미국인 개인정보(이름, 사회보장번호, 주소 등)를 탈취했습니다.

이 사건은 단 하나의 구성요소를 제때 업데이트하지 않은 것이 얼마나 재앙적인 결과를 초래할 수 있는지 전 세계에 똑똑히 보여주었습니다.


🛠️ 내 프로젝트의 '썩은 주춧돌' 찾아내고 교체하기 (대응 방안)

그렇다면 우리 애플리케이션을 구성하는 수백, 수천 개의 부품을 어떻게 안전하게 관리할 수 있을까요?

1. 내가 무엇을 쓰는지 파악하라: 인벤토리 작성

가장 첫 번째 단계는 우리 시스템이 어떤 구성요소에 의존하고 있는지 정확한 목록(인벤토리)을 만드는 것입니다. 프론트엔드 라이브러리(React, Vue, jQuery 등), 백엔드 프레임워크(Spring, Django 등), 그리고 그 하위의 수많은 의존성 라이브러리까지 모두 파악해야 합니다. package.json, pom.xml, requirements.txt 파일 등이 좋은 시작점이 될 수 있습니다.

 

2. 자동화된 도구를 활용한 취약점 스캔

수동으로 모든 구성요소의 취약점을 확인하는 것은 불가능합니다. SCA(Software Composition Analysis, 소프트웨어 구성 분석) 도구를 사용하여 이 과정을 자동화해야 합니다.

  • OWASP Dependency-Check: OWASP에서 제공하는 무료 오픈소스 도구로, 프로젝트의 의존성을 스캔하여 알려진 취약점이 있는지 찾아줍니다.
  • GitHub Dependabot: GitHub 저장소에 포함된 의존성을 자동으로 스캔하고, 취약점이 발견되면 보안 업데이트를 제안하는 Pull Request를 생성해 줍니다.
  • 상용 SCA 솔루션: Snyk, Black Duck, Veracode 등 더 강력한 기능과 지원을 제공하는 다양한 상용 도구도 있습니다.

이러한 도구를 CI/CD 파이프라인에 통합하면, 새로운 코드가 빌드될 때마다 자동으로 의존성을 검사하여 취약한 구성요소가 유입되는 것을 조기에 차단할 수 있습니다. 🤖

 

3. 불필요한 구성요소 제거

더 이상 사용하지 않는 기능, 위젯, 프레임워크나 불필요한 의존성은 과감하게 제거해야 합니다. 구성요소가 적을수록 관리해야 할 대상이 줄어들고 공격 표면(Attack Surface)도 그만큼 감소합니다.

 

4. 신뢰할 수 있는 출처에서만 구성요소 획득

공식 저장소(NPM, Maven Central, PyPI 등)가 아닌 신뢰할 수 없는 출처에서 라이브러리를 다운로드하면, 악성 코드가 숨겨져 있거나 변조되었을 위험이 있습니다. 항상 공식적이고 안전한 경로를 통해 구성요소를 획득해야 합니다.

 

5. 신속한 패치 및 업데이트 정책 수립

새로운 취약점이 발견되었을 때 신속하게 대응할 수 있는 정책과 프로세스를 마련해야 합니다. 정기적으로 구성요소의 버전을 확인하고, 보안 패치가 나오면 테스트 후 최대한 빠르게 적용하는 것이 중요합니다.


2021년 OWASP Top 10에서는 이 항목이 A06: 취약하고 오래된 구성 요소(Vulnerable and Outdated Components)라는 이름으로 순위가 상승하며 그 중요성을 다시 한번 입증했습니다.

 

현대 개발 환경에서 외부 구성요소를 사용하지 않는 것은 상상하기 어렵습니다. 편리함을 얻는 대신, 그 구성요소의 보안까지 책임져야 한다는 '관리의 책임'이 함께 따라온다는 사실을 반드시 기억해야 합니다.

 

반응형

관련글 더보기