반응형
- 아래 내용은 2020년 Hitcon Conference 발표 자료를 번역하여 작성한 내용임을 밝힙니다.
- CoeQL은 Variant Analysis를 지원하는 광범위한 라이브러리와 함께 제공되며, 여러 Langauge(C/C++, C#, Java, Javascript, Python ..)을 지원합니다.
- Static Analysis
- Data Flow Analysis
- Taint Anaylsis
- CFG Analysis
Static Analysis
- Snapshot Database에서 정적 항목 찾기
- 복잡한 요구사항 없이 결함을 빠르게 정확한 찾음
- 찾는 유형 : 하드코딩된 패스워드, 위험한 함수 등등
Data Flow Analysis
- Value-Preserving Flow를 통하여 단일 값을 전달하는 Data Flow를 분석함
- Data Node끼리 Data를 어떻게 전달하고 받는 지 확인할 수 있음
- 흥미로운 경로를 발견하기 위한 초기 단계로 볼 수 있음
Taint Analysis
- DataFlow Analysis와는 다르게 Non-Value-Preserving Flow를 포함한 Data Flow를 분석함
- 예를 들어 x가 오염되었다면, y 역시 오염되었다고 볼 수 있음
var temp = x;
var y= temp+ ", " + temp;
CFG Analysis
- 절차 내 CFG 측면에서 다른 프로그램 표현을 사용??
- 단일 제어 흐름 노드가 아닌 블록으로 표현??
CVE를 기반으로 CVE 찾기
- 왜 해야 될까요?
- 알려진 취약점 케이스를 제공하는 것만으로도 일부 취약점을 조치할 수 있음
- CodeQL로 과거 취약점을 모델링하여 다른 경로의 동일한 취약점을 찾을 수 있음
- 다른 Project나 Repository에서 동일한 취약점을 찾을 수 있음
- 이러한 경우를 Variant Analysis라고 하며, 알려진 취약점을 Seed로 사용하여 다른 코드 베이스에서 유사한 취약점 찾는 프로세스를 의미함
과거 취약점 모델링을 통한 취약점 찾기
Keybase Hostname 검증 정규 표현식
- Keybase Hostname 검증 정규 표현식은 은 \\.가 아닌 \.를 사용하고 있어 취약점이 발생했음
- '\.twitter\.com/([\\w]+)[/]?$'
- '\.twitter\.com/[\\w]+[/]?$'
Step 1. Find all occurrence
from InvokeExpr c
where c.getCalleeName() = "RegExp"
select c
Step 2. Find all occurence with "*" inside
from InvokeExpr c, StringLiteral s
where c.getCalleeName() = "RegExp" and
s.getStringValue().matches("%.%") and
s.getEnclosingStmt() = c.getEnclosingStmt()
select c
Electron 1.2.2. ~ 4.2.12
- Web Extension을 활성화기 위해 URL을 확인하는 과정에서 정규 표현식 검증 실패
- 패치 코드
Umbraco CMS LFI
- Umbraco에서 사용하는 ClientDependency Package는 Root Path에 DependencyHalder.axd File을 노출함
- 해당 파일은 Base64로 인코딩되어 제공된 CSS 및 Javascript File을 결합하고 축소하는 데 사용됨
- /DependencyHandler.axds=L3VtYnJhY28vbGliL2pxdWVyeS9qcXVlcnkubWluLmpz&t=Css&cdv=1
- /umbraco/lib/jquery/jquery.min.js
- ClientDependency를 통한 LFI는 다양한 곳에서 발생하고 있어, Variant Analysis에 좋은 타겟으로 보임
- 공격 PoC
- GET /DependencyHandler.axd ?s=http://umbraco.example.com/web.config&t=Css&cdv=1
Flow Modeling
- Asp.Net에서는 사용자의 Request를 Intercept 하기 위해 IHttpHandler Interface를 구현하는 것이 일반적임
- 따라서 이러한 Class는 좋은 Source가 될 수 있음
- 실제 ClientDependency의 소스 코드 분석 결과, WriteFileToStream 함수가 취약점의 원인이었음
- 따라서 WriteFileToStream 함수는 좋은 Sink가 될 수 있음
- CodeQL을 통하여 두 개의 플로우를 모델링을 수행함
- 이후 ClientDependency 1.8.2.1 ~ 1.9.8에서 새로운 LFI를 발견함
더 좋은 패턴을 통한 취약점 탐지
Method 1. Grep / Strings/ Regular Experssion
- Pros
- 빠르고 효율적이고 직관적임
- 특정 객체를 찾는 데 뛰어남
- Cons
- 유사한 이름을 가진 관련 없는 항목에 적용됨
- 코드의 원인을 찾기 힘듦
Method 2. UML Class Diagram
- Pros
- 빠르고 효율적이고 직관적임
- 관계 매핑에 뛰어남
- Cons
- 코드가 복잡하면 성능이 저하됨
- 또한, 모든 관계를 추적하는 것이 쉽지 않음
- CVE-2018-1000861
- 해당 취약점은 RCE가 가능한 취약점이며, Jenkins에서 사용하는 Stapler Web Framework에 발생함
- Stapler staplers는 대부분의 개체를 URL에 연결함
- UML을 사용하여 RCE Chain에 사용할 수 있는 좋은 Gadget 찾기
Method 3. CodeQL
- Pros
- 훨씬 더 일반적이거나 까다로운 케이스를 다룰 수 있음
- 유지 관리 및 지속성이 뛰어남
- Cons
- 패턴 정의를 위해서는 전문가가 필요함
- 처리 및 계산에 시간 소요
- CVE-2020-XXXX
- machineKey를 유출할 수 있는 경우 Pre-Auth RCE가 가능한 취약점
- UmbracoEnsurePage Class는 Page에 Access하기 전에 사용자의 Pre-Auth 확인을 진행함
- RCE를 획득하기 위해 필요한 Gatget 등을 쉽게 찾기 위한 방법을 고민하고 있음
- 아래 Query를 통하여 인증 없이 직접 액세스할 수 있는 Umbraco 페이지를 찾았으며, 공격에 좋은 포인트가 될 수 있을 것 같음
- /umbraco/ping.aspx
회귀 테스트
SSDLC Adoption
- S-SDLC의 약자로 Secure Software Development Life Cycle의 약자
- 시스템 개발 수명 주기에 보안 활동을 추가하는 것을 의미하며, DevSecOps의 일부임
CodeQL을 통하여 Test를 수행하기 위해서는 어떻게 해야 되는가?
- 보안 전문가가 CodeQL을 사용하여 일반적인 취약 모델링을 정의
- 하드코딩 된 패스워드, OOB Access 등
- CodeQL을 이용한 Variant Analysis의 공개 연구 및 논문을 참고
- 커뮤니티 중심인 lgtm은 이미 많은 규칙을 제공하였음
- 또한, 보안을 위한 규칙도 별도로 존재함
- 커뮤니티 중심인 lgtm은 이미 많은 규칙을 제공하였음
Client-side URL Redirect
- 사용자의 입력 값을 확인하지 않을 경우 Client Side의 URL Redirection을 통한 악성 웹 사이트로 Redirect 될 수 있음
Untrusted XML is read insecurely
- 신뢰할 수 없는 XML은 안전하지 않은 resolver와 DTD Processing이 활성화 된 상태에서 읽을 수 있음
CVE-2020-XXXX (실제로 자료에서 2번 나옴)
- machineKey를 유출할 수 있는 경우 Pre-Auth RCE가 가능한 취약점
- machineKey는 다음 요서에 대한 황금 열쇠임
- ViewState
- Forms Authentication
- Out-of-Process Session
- 또한, 자동으로 생성되며 고유한 값을 가지고 있음
- 개발자는 Web Frams를 지원하도록 설정할 수 있음
- machineKey는 다음 요서에 대한 황금 열쇠임
- UmbracoEnsurePage Class는 Page에 Access하기 전에 사용자의 Pre-Auth 확인을 진행함
- RCE를 획득하기 위해 필요한 Gatget 등을 쉽게 찾기 위한 방법을 고민하고 있음
- 아래 Query를 통하여 인증 없이 직접 액세스할 수 있는 Umbraco 페이지를 찾았으며, 공격에 좋은 포인트가 될 수 있을 것 같음
- /umbraco/ping.aspx
- ASP.NET은 machineKey를 사용하여 _VIEWSTATE 또는 인증 양식을 복호화하고 유효성을 검증함
- ASP.NET 4.5 이전에는 ViewState가 안전하지 않다고 가정하고 Default로 암호화를 수행하지 않음
- ASP.NET 4.5 이후에는 Default로 암호화를 수행하고 ASP.NET 4.5.2 이후에는 MAC으로 처리됨
- 4.5 이전 버전에는 사용자가 평문으로 VIEWSTATE를 볼 수 있기 때문에 유출된 machineKey를 사용하여 암호화 및 유효성 검사 요구 사항을 충족하는 Serialized된 객체를 만들 수 있음
CodeQL의 미래
- 커뮤니티 기반의 Linting과 보안 검사에 대한 규칙들의 집합이 될 것
- 더 많은 언어가 지원됨에 따라 CodeQL은 더 넓은 범위의 Library와 코드 베이스를 다룰 수 있을 것
- CVE를 찾는 과정은 반복적이고 일반화될 것
'Hack > Web' 카테고리의 다른 글
[go-and-dont-return] Github Security Lab CodeQL CTF (0) | 2023.08.21 |
---|---|
CodeQL 설치 및 사용 방법 (0) | 2023.08.21 |
[CVE-2023-0842] xml2js Prototype Pollution (0) | 2023.05.13 |
BitB (Browser in the Browser) 공격 (1) | 2023.04.23 |
[CVE-2023-20860] Spring Framework Improper Access Control (0) | 2023.03.26 |
댓글