Exposing Library API Misuses via Mutation Analysis

정보

Keywords

  • Library API 오용
  • Mutation 분석

배경

  • Library API 오용은 소프트웨어에 crash 및 취약점을 야기할 수 있음
  • 다양한 정적 분석 도구들이 Library API 오용을 탐지하는 것을 제안해 왔지만, 실제로 이를 적용하기에는 무리가 있음

목표

  • 높은 정확도로 API 오용을 탐지할 수 있는 도구를 개발하고자 함
    • API 오용 패턴을 발견할 수 있는가?
    • MuBench에서 API 오용을 탐지할 수 있는가?
    • 기존 mutation 기법과 비교해서 얼마나 더 효과적이고 효율적인지?

방법론

  • API 오용 패턴에 대한 발견이 있음
    1. API 오용은 올바른 용법의 mutant로 표현할 수 있음
    2. mutant가 오용인지 아닌지는 실행하고 그 결과를 분석해 봄으로써 검증할 수 있음
      • 각 mutant에 대하여 client 프로젝트의 테스트 케이스로 실행시켜 보고 killing relations(테스트 실패한 mutant 및 test case)를 수집
  • 위의 발견을 기반으로 MutAPI 도구를 제안함

결과

  • 16개의 프로젝트에서 73개의 유명 JAVA API를 대상으로 0.78의 오용 패턴을 발견할 수 있었음 (상위 50개의 mutant 후보에 대하여)
  • MuBench에서 53개의 진짜 오용 중 26개를 탐지함

결론

  • 많은 수의 API 사용 예제를 필요로 하지 않음
  • "빈번한 패턴에서 벗어난 것은 오용이다"라는 가정에서 더 나아감

*궁금점

  • test suite에 상당히 의존하는 구조인데, 1) 이는 신뢰할 수 있는 것이며, 2) test suite가 이를 못잡는 경우는 어떻게 해결했는지?

CryptoGo: Automatic Detection of Go Cryptographic API Misuses

정보


Keywords

  • Cryptographic API misuses
  • Go
  • STA (Static Taint Ananlysis)

배경

  • 안전한 시스템을 만듦에 있어 암호 알고리즘들은 필수적이나, 다양한 암호 API의 오용으로 인해 기대한 바에 못 미치고 있음
    • 암호 라이브러리 API의 복잡성에 비해 빈약한 문서화
    • 개발자의 불충분한 암호 경험
  • Java, C/C++, Python 등에서 암호 API 오용에 관한 많은 연구가 이뤄지고 있지만, 비슷한 문제를 안고 있는 Go에서는 이뤄지고 있지 않음
    • Go는 블록체인 및 PKI (Public-Key Infrastructure)에서도 많이 활용되기에 올바른 암호 API 사용은 중요함

목표

  • Go 암호 API와 결합된 12개의 암호 규칙들을 도출함
  • 암호 알고리즘 분류(?)를 암호 오용 탐지에 처음으로 통합함
  • 대규모의 Go 암호 프로젝트에서 암호 오용을 자동으로 식별할 수 있는 CryptoGo를 설계하고 구현함

방법론

  • taint analysis 기반의 정적 분석 탐지기
  • Go 소스코드의 중간 언어에서 API 및 인자를 대상으로 역방향 또는 순방향의 taint tracking을 수행함

결과

  • GitHub에 있는 120개의 Go 암호 프로젝트를 대상으로 했으며, 83.33%의 프로젝트에서 1개 이상의 암호 오용을 발견함
  • 평균적 1,000줄 분석에 86.27ms 소요됨

결론

  • 현재 Go 암호 프로젝트의 낮은 수준의 구현과 약한 보호력을 강조함

Code as Graph

AST (Abstract Syntax Trees)

: 프로그램 코드의 syntactic structure를 그래프로 표현함
: 고수준의 소스코드를 기계코드로 변환시켜줌

  • [Java] javaparser
    • Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13
  • [Java] PropertyGraph
    • A library to generate AST, CFG, PDG for Java program
      • JDK version 8+
    • git clone https://github.com/Zanbrachrissik/PropertyGraph
      java -jar PropertyGraph/out/artifacts/PropertyGraph_jar/PropertyGraph.jar -d src -a

CFGs (Control Flow Graphs)

: 코드가 실행되면서 분기되는 것을 그래프로 표현함

  • [Java] PropertyGraph
    • A library to generate AST, CFG, PDG for Java program
      • JDK version 8+
    • git clone https://github.com/Zanbrachrissik/PropertyGraph
      java -jar PropertyGraph/out/artifacts/PropertyGraph_jar/PropertyGraph.jar -d src -c
  • [Java] bytecode-to-cfg
    • Generation of a Control Flow Graph from a java bytecode using ASM
  • [Java] kfg
    • Library for building CFG for Java bytecode
  • [Smali] Smali-CFGs
    • Smali Control Flow Graph's

CPG (Code Property Graph)

:

  • [C/C++/Java/Binary/Javascript/Python/Kotlin] joern
    • Open-source code analysis platform for C/C++/Java/Binary/Javascript/Python/Kotlin based on code property graphs
  • [Java] plume
    • Plume is a code property graph analysis library with options to extract the CPG from Java bytecode and store the result in various graph databases.

DDG (Data Dependence Graph)

:

PDG (Program Dependence Graph)

: data 및 control 의존성을 명시적으로 그래프로 표현함

  • [Java] accrue-bytecode
    • Interprocedural Java byte code analysis framework together with several analyses. Notably includes a multi-threaded points-to analysis (flow-sensitive and flow-insensitive) and a PDG construction analysis.
  • [Java] PropertyGraph
    • A library to generate AST, CFG, PDG for Java program
      • JDK version 8+
    • git clone https://github.com/Zanbrachrissik/PropertyGraph
      java -jar PropertyGraph/out/artifacts/PropertyGraph_jar/PropertyGraph.jar -d src -p
  • [Java] sourcedg
    • System Dependence Graph generation from Java source code
  • [Java] TinyPDG
    • A library for building intraprocedural PDGs for Java programs

'0x50 Machine Learning' 카테고리의 다른 글

dlerror: cudart64_101.dll not found  (1) 2021.08.01

파일을 다운로드 받은 후, 이 파일에 대하여 살펴보면 Fix the Disk!!!!라는 메시지와 함께 MBR이 손상된 것을 확인할 수 있다.

MBR은 중요한 섹터이기에 백업 섹터가 존재하는데 그 위치가 0x00000C00이다. 해당 영역으로 가면 아래와 같이 MBR이 백업되어 있는 것을 확인할 수 있다.

그렇기에 이 섹터를 복사하여 0번째 섹터에 복구하면, 해당 파일을 파일시스템으로 열 수 있다.

그 후 FTK Imager 도구를 이용하여 이 파일시스템을 돌아다녀 보면, 위와 같은 압축파일을 찾을 수 있다. 하지만 이 압축파일은 비밀번호가 걸려 있으며, 이 비밀번호는 GG.PNG 파일에서 확인할 수 있다.

여기서 찾은 비밀번호를 이용하여, 압축파일을 해제하고 FINISH_FIX.txt를 열어보면 플래그를 확인할 수 있다.

'0x20 Forensics' 카테고리의 다른 글

HackThisSite.org :: Forensic 1  (1) 2019.09.17

이것저것 뒤적여 보다가, 설마를 외치며 DH{ 를 검색해 보았다...

주석으로 flag가 숨어 있다...

'0x40 Web Hacking' 카테고리의 다른 글

Dreamhack :: simple_sqli  (0) 2022.05.17
Dreamhack :: session-basic  (0) 2022.05.17
Dreamhack :: Carve Party  (0) 2022.05.17
Dreamhack :: simple-ssti  (0) 2022.05.17

문제에서 제공해주는 app.py 플라스크 코드를 보면 간단하게 DB를 생성하는 부분과 로그인 하는 부분으로 구분되어 있는 것을 알 수 있다.

DB를 생성하는 부분은 guest/guest 계정과 admin/os.urandom(16) 계정을 만들며,
로그인 부분에서는 사용자로부터 id와 password를 입력받아 쿼리를 보낸다. 하지만 사용자로부터 받은 입력 값에 대한 검증이 없기 때문에 sql injeciton을 허용한다.

해당 어플리케이션에서 사용한 DB는 sqlite3로 주석으로 -- 를 사용한다.
즉 사용자의 계정에 admin을 넣고 그 뒤를 주석 처리해 버리면 된다.

상세 과정

select * from users where userid="{userid}" and userpassword="{userpassword}"

쿼리는 사용자로부터 입력 받은 값들을 그대로 사용하게 된다.

admin” -- 를 id 부분에 넣고, 비밀번호 부분에는 아무것이나 넣어주면(e.g., 1234) 쿼리는 다음과 같이 된다.

select * from users where userid="admin" -- and userpassword="1234"

그러면 주석 뒤 부분은 무시가 되기 때문에 아래와 같은 쿼리가 된다.

select * from users where userid="admin"

즉 admin에 대한 계정을 조회하는 쿼리가 되는 것이다.
따라서 admin 계정의 비밀번호를 모르더라도 로그인 할 수 있게 된다.

'0x40 Web Hacking' 카테고리의 다른 글

Dreamhack :: devtools-sources  (0) 2022.05.17
Dreamhack :: session-basic  (0) 2022.05.17
Dreamhack :: Carve Party  (0) 2022.05.17
Dreamhack :: simple-ssti  (0) 2022.05.17

웹 어플리케이션은 크게 3부분('/', '/login', '/admin')으로 구성되어 있다.

우선 / 라우트를 보면, session_storage에서 session_id를 기반으로 username을 가져오고 이 username이 admin 일때 flag를 보여주도록 한다.
그렇기에 우리가 해야할 것은 쿠키의 sessionid 값을 admin의 것으로 바꾸면 될 것이다.

그렇기에 필요한 라우트가 /admin이다. /admin 라우트에서는 저장되어 있는 session_storage를 보여주는데 어플리케이션이 시작되기 전 session_storage에 username이 admin인 session_id를 저장해 두기 때문에, 해당 session_id를 가져와서 쿠키에 저장되어 있는 sessionid 값을 이로 바꿔주면, admin 계정이 로그인 한 것으로 인식할 것이다.

상세 과정

  • /login 라우트에서 guest/guest 로 로그인함
  • /admin 라우트에서 값이 adminsession_id를 확인함
  • 쿠키의 sessionid 값을 위의 adminsession_id로 수정함
  • / 라우트에서 플래그 확인함

'0x40 Web Hacking' 카테고리의 다른 글

Dreamhack :: devtools-sources  (0) 2022.05.17
Dreamhack :: simple_sqli  (0) 2022.05.17
Dreamhack :: Carve Party  (0) 2022.05.17
Dreamhack :: simple-ssti  (0) 2022.05.17

문제를 보면 특정 사이트에 연결된 것이 아닌 html 파일 하나를 준다. 즉 이는 서버에서 뭔가를 수행하는 것이 아닌 클라이언트에서 작업을 수행하는 것을 유추할 수 있다.

클릭에 따른 counter 값 감소, 특정 값에 도달할 때 뭔가를 수행함을 생각해 볼때, 제일 먼저 생각난 것은 onclick event에 따른 counter 값 증가였다.

하지만 onclick 은 사용되지 않았으며, script 부분을 살펴본 결과 click에 call back 함수를 정의한 것을 확인할 수 있다.

함수를 보면 pumpkin 리스트에 대하여 특정 연산을 수행하고, 이를 기반으로 canvas에 그리게 된다.

상세 과정

방법 1

이를 기반으로 python 코드를 작성해 보면 다음과 같으며, counter가 100번째마다 for문을 반복하기에 총 100번 수행됨을 알 수 있기에 해당 부분을 생략하고 100번 반복하는 것으로 하였다.

pumpkin, pie = [ 124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53 ], 1

for j in range(100):
    for i in range(len(pumpkin)):
        pumpkin[i] ^= pie
        pie = ((pie ^ 0xff) + (i * 10)) & 0xff

print(list(map(chr, pumpkin)))

방법 2

그 결과 위와 같은 복호화 결과를 확인할 수 있으며, 이를 console에서 javascript를 이용하여 10000번 클릭 시켜도 동일한 결과를 확인할 수 있다.

while (counter <= 10000) $('#jack-target').click();

'0x40 Web Hacking' 카테고리의 다른 글

Dreamhack :: devtools-sources  (0) 2022.05.17
Dreamhack :: simple_sqli  (0) 2022.05.17
Dreamhack :: session-basic  (0) 2022.05.17
Dreamhack :: simple-ssti  (0) 2022.05.17

+ Recent posts