Vulnerable Components
Concept
소프트웨어를 만드는 방식이 바뀌었다. 오픈 소스 커뮤니티는 성숙하고 있으며 오픈 소스 소프트웨어의 가용성은 응용 프로그램에 사용되는 라이브러리의 출처를 결정하는 것과 관계없이 많아졌다.
참고 : https://www.sonatype.com/hubfs/SSC/Software_Supply_Chain_Inforgraphic.pdf?t=1485298506170
이 단원에서는 종속 라이브러리 관리의 어려움, 종속성을 관리하지 않을 위험 및 위험에 처해 있는지 여부를 결정하는 어려움을 살펴본다.
Goals
- 소비되는 오픈 소스가 자신의 사용자 정의 코드만큼 중요하다는 인식을 얻으시오.
- 오픈소스 컴포넌트 소비에서 관리에 대한 인식 또는 관리 부족을 파악한다.
- 오픈소스 구성요소 리스크를 결정할 때 Bill of Materials의 중요성을 이해한다.
The Open Source Ecosystems
- 1000만 개 이상의 GitHub 코드 저장소
- 100만 개의 Sourceforge 코드 저장소
- 2500개의 public binary 저장소 : 일부 저장소는 엄격한 게시자 표준이 있다.
-- 일부 저장소에서 소스 코드 배포를 적용한다.
-- published 소스 코드가 published 바이너리의 소스 코드라는 보장이 없다.
- 일부 저장소에서는 동일한 버전에 대해 다른 bit 집합을 다시 publish할 수 있다.
- 일부 저장소에서는 published artifacts를 제거할 수 있다.
- 같은 언어라도 다양하게 다른 packaging 시스템
- 다양한 조정 시스템 및 세분화 수준
Components are everywhere
WebGoat는 거의 200개의 Java 및 JS 라이브러리를 사용한다. 대부분의 Java 응용 프로그램과 마찬가지로 Maven을 사용하여 Java 종속성을 관리하고 JS를 관리하기위한 와일드 웨스트 전략을 사용한다.
* Maven
https://goddaehee.tistory.com/199
빌드란? 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 결과물.
- 소스코드, 파일, 자원 등(xml, jpg, jar, properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 결과물
빌드 도구란? 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
- 라이브러리 버전 동기화 해결, Ant -> Maven -> Gradle
Maven? 자바용 프로젝트 관리도구
Vulnerable components in WebGoat?
웹고트도 구성 요소 안에 12개 이상의 높은 보안 위험을 포함하였다.
The exploit is not always in "your" code
아래는 동일한 웹고트 소스 코드를 사용하지만 다른 버전의 jquery-ui 구성 요소를 사용하는 예이다. 하나는 exploit 가능하고 하나는 그렇지 않다.
jquery-ui: 1.10.4
이 예에서는 jquery-ui dialog의 "closeText" 내용을 지정할 수 있다. 이것은 예상 밖의 시나리오지만 jquery-ui dialog (TBD-show accourit link)는 close dialogs의 button text에서 xss를 방어하지 않는다.
jquery-ui: 1.12.0 Not Vulnerable
동일한 WebGoat 소스코드를 사용하지만 jquery-ui 라이브러리를 취약하지 않은 버전으로 업그레이드하면 공격이 제거된다.
Knowing the OSS "Bill of Materials" is the starting point
현대의 응용 프로그램들은 커스텀 코드와 많은 오픈 소스들로 구성되어 있다. 개발자는 일반적으로 사용자 지정 코드에 대해 잘 알고 있지만 사용하는 라이브러리/구성 요소의 잠재적 위험에 대해서는 잘 알지 못한다. bill of materials(BOM)을 레시피 재료 목록으로 생각하라.
Questions we should know the answer to:
- 애플리케이션에 어떤 오픈 소스 구성요소가 있는지 어떻게 알 수 있는가?
- 어떤 버전의 오픈 소스 구성 요소를 사용하고 있는지 어떻게 알 수 있는가?
- 오픈 소스 구성요소의 위험을 어떻게 정의해야 하는가?
- 오픈 소스 구성요소의 위험을 어떻게 발견하고 있는가?
- 특정 위험을 오픈 소스 구성요소의 특정 버전과 어떻게 연관시키고 있는가?
- 구성 요소가 새 버전을 출시할 때 어떻게 알 수 있는가?
- 이전에 좋은 구성요소에서 새로운 취약성이 발견되었는지 어떻게 알 수 있는가?
- 오픈소스 구성요소의 정품 버전을 사용하고 있는지 어떻게 알 수 있는가?
How do I generate a Bill of Materials
구성요소의 위험을 식별하는 몇 가지 오픈 소스 및 유료 솔루션이 있다. 그러나 응용 프로그램 내에서 사용되는 "ingredients"의 전체 목록을 제공하는 도구는 많지 않다. OWASP 의존성 검사는 BOM을 생성하고 잠재적인 보안 위험을 식별할 수 있는 기능을 제공한다.
종속성 검사는 몇 가지 증거를 사용하여 라이브러리 이름을 결정한다. 예를 들어 OWASP 종속성 검사를 Maven 프로젝트의 pom.xml에 플러그인으로 추가할 수 있다. 플러그인은 공용 취약성 데이터베이스에서 정보를 다운로드하고 취약한 라이브러리가 사용되었는지 확인하고 보고된 취약성을 표시한다.
개발 파이프라인의 일부에 개발 팀이 알지 못한 위반이 있을 경우 플러그인이 빌드에 실패하도록 지시할 수 있다. 또한 xml 파일을 사용하여 위반 사항 중 일부를 면제할 수 있다. 언급한 취약성을 응용 프로그램에서 이용할 수 없는 경우 이 작업을 수행해야 한다.
WebGoat의 상위 pom.xml에서 예를 볼 수 있다.
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>5.3.2</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<skipProvidedScope>true</skipProvidedScope>
<skipRuntimeScope>true</skipRuntimeScope>
<suppressionFiles>
<suppressionFile>project-suppression.xml</suppressionFile>
</suppressionFiles>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
* pom.sml
Maven의 빌드 정보를 담고 있는 파일, POM(Project Object Model)을 설정하는 부분으로 프로젝트 내 빌드 옵션을 설정. 다른 프로젝트에도 복사-붙여넣기하면 됨, 협업에 버전 통일 편리
위반 예시
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
<suppress base="true">
<cpe>cpe:/a:pivotal_software:spring_security</cpe>
<cve>CVE-2018-1258</cve>
</suppress>
<suppress base="true"><!-- webgoat-server -->
<cpe>cpe:/a:postgresql:postgresql</cpe>
<cve>CVE-2018-10936</cve>
</suppress>
</suppressions>
WebGoat의 경우 플러그인은 다음을 실행할 때 활성화 된다 (owasp profile) :
mvn clean install -Powasp
webgoat-container/target/dependency-check-report.html을 참고하여 찾을 수 있는 보고서 이다.
Security Information Overload
무엇이 중요한가?
- 내 구성요소가 악용 될 수 있는가?
- 내 구성요소가 정품인가?
-- 내 구성요소가 왜 수정되었는지 이해하고 있나?
보안 정보가 사방에 흩어져 있다.
- 보안 권고의 여러 출처
- 80,000+ CVEs in the National Vulnerbility Database
- Node Security Project, Metasploit, VulnDB, Snyk, …
- Thousands of website security advisories, blogs, tweets, …
- 날마다 생기는 60만개의 GitHub 사건들
- 700 GitHub security related events
- Release notes, change logs, code comments, …
Summary
- 개발자가 각 구성 요소를 지속적으로 연구하기를 기대하는 것은 합리적이지 안핟.
- 개발자들은 보안 전문가가 아니다
License Information Overload
무엇이 중요한가?
- 소프트웨어 배포 환경에서 이 구성 요소를 사용할 수 있는가?
- 라이센스 비호환성이 있는가?
- 변경된 구성 요소를 사용하는 경우 추가 라이센스 의무를 해결했는가?
라이센스 정보가 사방에 흩어져 있다.
- 프로젝트는 라이센스를 선언한다.
- In a project metadata file.
- On the project website or source code repository page.
- Using a link to a license file in their own source code repository.
- In a license file within the project source tree.
- In the binary META-INF folder.
- 프로젝트는 라이센스가 소스코드의 헤더로 포함된다.
Summary
- 라이센스의 범위를 결정하는 것은 어렵다.
- 프로젝트에 라이센스 불일치가 많다.
- 개발자는 변호사가 아니다.
[ 문제 ]
Exploiting CVE-2013-7285 (XStream)
WebGoat uses an XML document to add contacts to a contacts database.
=> 직렬화 한다.
Start by sending the above contact to see what the normal response would be and then read the CVE vulnerability documentation (search the Internet) and try to trigger the vulnerability.
<contact>
<id>1</id>
<firstName>Bruce</firstName>
<lastName>Mayhew</lastName>
<email>webgoat@owasp.org</email>
</contact>
CVE-2013-7285
The processed stream at unmarshalling time contains type information to recreate the formerly written objects. XStream creates therefore new instances based on these type information. An attacker can manipulate the processed input stream and replace or inject objects, that can execute arbitrary shell commands.
- unmarshalling : 마샬링 : Java Object를 XML로 변환 (직렬화)
-
나는 버전이 맞다.