본문 바로가기
Hack/Web

[2020 Hitcon] Discover Vulnerabilities with CodeQL 번역

by Becoming a Hacker 2023. 7. 25.
반응형

 

  • CoeQL은 Variant Analysis를 지원하는 광범위한 라이브러리와 함께 제공되며, 여러 Langauge(C/C++, C#, Java, Javascript, Python ..)을 지원합니다.
    • Static Analysis
    • Data Flow Analysis
    • Taint Anaylsis
    • CFG Analysis

Semmle QL 작동 방식 (Semmle QL : Programming Language 분석을 위한 강력한 Query Language)

 

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에 좋은 타겟으로 보임
 

Flow Modeling

  • Asp.Net에서는 사용자의 Request를 Intercept 하기 위해 IHttpHandler Interface를 구현하는 것이 일반적임
    • 따라서 이러한 Class는 좋은 Source가 될 수 있음
  • 실제 ClientDependency의 소스 코드 분석 결과, WriteFileToStream 함수가 취약점의 원인이었음
    • 따라서 WriteFileToStream 함수는 좋은 Sink가 될 수 있음
  • CodeQL을 통하여 두 개의 플로우를 모델링을 수행함
  • 이후 ClientDependency 1.8.2.1 ~ 1.9.8에서 새로운 LFI를 발견함
Source Node 1

Source Node 2

Sink Node 1
Sink Node 2
 

더 좋은 패턴을 통한 취약점 탐지

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은 이미 많은 규칙을 제공하였음
      • 또한, 보안을 위한 규칙도 별도로 존재함
 

The next step for LGTM.com: GitHub code scanning! - The GitHub Blog

Today, GitHub code scanning has all of LGTM.com’s key features—and more! The time has therefore come to announce the plan for the gradual deprecation of LGTM.com.

github.blog

 

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를 지원하도록 설정할 수 있음
  • 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를 찾는 과정은 반복적이고 일반화될 것

댓글