Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
sqlancer — 데이터베이스 시스템에서 로직 및 성능 버그를 찾기 위한 자동화된 테스트 | Kitploit
도구/GitHubGitHub/sqlancer/sqlancer
Vulnerability AnalysisFuzzingPapers & ResearchLearning & EducationDatabase Security
GitHubsqlancer/sqlancer

sqlancer

데이터베이스 시스템에서 로직 및 성능 버그를 찾기 위한 자동화된 테스트

저장소 보기
1.7k3983011일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
웹사이트
공유

Build Status

SQLancer

SQLancer는 데이터베이스 관리 시스템(DBMS)의 구현에서 버그를 자동으로 찾기 위한 도구입니다. 즉, 사용자가 작성한 쿼리가 아닌 DBMS 구현 코드 자체의 버그를 찾아냅니다. SQLancer는 성숙하고 널리 알려진 DBMS에서 수백 개의 버그를 발견했습니다.

SQLancer는 DBMS를 자동으로 테스트할 때 두 가지 핵심 과제를 해결합니다.

  1. 테스트 입력 생성: SQLancer는 SQL 문을 자동으로 생성하는 접근 방식을 구현합니다. 여러 단계로 운영되는 다양한 수동 작성 SQL 생성기를 포함합니다. 먼저 데이터베이스 스키마(테이블 및 해당 열의 집합)를 생성합니다. 그런 다음 이러한 테이블에 데이터를 삽입하고, 인덱스, 뷰 또는 데이터베이스별 옵션과 같은 다양한 종류의 데이터베이스 상태를 생성합니다. 마지막으로 쿼리를 생성하며, SQLancer가 제공하는 여러 결과 검증기(또는 테스트 오라클이라고도 함) 중 하나를 사용하여 검증할 수 있습니다. 표준적인 무작위 생성 방식 외에도, SQLancer는 피드백 기반의 테스트 입력 생성 접근 방식을 지원하며, 이는 가능한 한 많은 고유한 쿼리 계획을 실행하여 데이터베이스 시스템에서 다양한 흥미로운 동작을 유도하는 것을 목표로 합니다 [ICSE '23].
  2. 테스트 오라클: SQLancer의 핵심 혁신 중 하나는 DBMS에서 심층적인 버그를 발견하는 방법을 제공한다는 점입니다. 주된 초점은 논리적 버그를 찾는 것으로, 이는 DBMS가 잘못된 결과 집합을 반환하는 버그(예: 레코드 누락)를 의미합니다. 우리는 Ternary Logic Partitioning (TLP) [OOPSLA '20], Non-optimizing Reference Engine Construction (NoREC) [ESEC/FSE 2020], Pivoted Query Synthesis (PQS) [OSDI '20], Differential Query Plans (DQP) [SIGMOD '24], Constant Optimization Driven Database System Testing (CODDTest) [SIGMOD '25] 등 여러 상호 보완적인 테스트 오라클을 제안했습니다. 또한 Cardinality Estimation Restriction Testing (CERT) [ICSE '24]이라는 기법을 사용하여 DBMS가 더 효율적으로 결과를 생성할 것으로 합리적으로 기대되는 성능 문제의 특정 범주를 찾을 수 있습니다. SQLancer는 주어진 쿼리에 대해 DBMS가 반환할 수 있는 모든 잠재적 오류를 선언하여 예상치 못한 내부 오류(예: 데이터베이스 손상 오류)를 감지할 수 있습니다. 마지막으로 SQLancer는 DBMS 프로세스를 종료시키는 충돌 버그를 찾을 수 있으며, 이를 위해 암시적 테스트 오라클을 사용합니다.

커뮤니티. SQLancer 및 DBMS 테스트 일반에 대해 논의할 수 있는 Slack 워크스페이스가 있습니다. 이전에는 SQLancer가 Twitter/X에 @sqlancer_dbms 계정을 운영했지만, 현재는 유지 관리되지 않습니다. 블로그도 있으며, 현재로서는 Google Summer of Code 프로젝트 기여자들의 게시물만 포함되어 있습니다.

시작하기 [동영상 가이드]

최소 요구 사항:

  • Java 11 이상
  • Maven

다음 명령은 SQLancer를 클론하고, JAR을 생성하며, Non-optimizing Reference Engine Construction (NoREC)을 사용하여 SQLite를 테스트하기 위해 SQLancer를 시작합니다:``` git clone https://github.com/sqlancer/sqlancer cd sqlancer mvn package -DskipTests cd target java -jar sqlancer-*.jar --num-threads 4 sqlite3 --oracle NoREC

**실행 및 종료.** 실행 시 5초마다 진행 정보가 출력된다면, 도구가 예상대로 작동하는 것입니다. CTRL+C 단축키를 사용하여 SQLancer를 수동으로 종료할 수 있습니다. SQLancer가 버그를 찾지 못하면 무한히 실행됩니다. `--num-tries` 옵션을 사용하여 SQLancer가 몇 개의 버그를 찾은 후 종료될지 제어할 수 있습니다. 또는 `--timeout-seconds` 옵션을 사용하여 SQLancer가 실행될 최대 시간을 지정할 수 있습니다.

**매개변수.** 매개변수 없이 SQLancer를 실행하면 사용 가능한 옵션과 명령이 표시됩니다. 모든 DBMS 테스트 구현에서 지원하는 일반 옵션(예: `--num-threads`)은 테스트할 DBMS 이름(예: `sqlite3`) 앞에 와야 합니다. 특정 DBMS에서만 지원되는 옵션(예: SQLite3의 `--test-rtree`) 또는 각 테스트 구현이 서로 다른 값을 제공하는 옵션(예: `--oracle NoREC`)은 DBMS 이름 뒤에 와야 합니다.

**DBMS.** SQLite에서 SQLancer를 실행하기 위해 DBMS를 설치하고 설정할 필요는 없었습니다. 그 이유는 임베디드 DBMS가 애플리케이션과 동일한 프로세스에서 실행되므로 별도의 설치나 설정이 필요 없기 때문입니다. SQLancer가 지원하는 임베디드 DBMS로는 DuckDB, H2, SQLite가 있습니다. 해당 바이너리는 [JAR 종속성](https://github.com/sqlancer/sqlancer/blob/main/pom.xml)으로 포함되어 있습니다. 이러한 시스템의 충돌은 SQLancer가 실행되는 JVM의 충돌도 유발할 수 있습니다.

# SQLancer 사용하기

**로그.** SQLancer는 로그를 `target/logs` 하위 디렉터리에 저장합니다. 기본적으로 `--log-each-select` 옵션이 활성화되어 있어 DBMS로 전송된 모든 SQL 문이 기록됩니다. 해당 파일 이름에는 `-cur.log` 접미사가 붙습니다. 또한 SQLancer가 논리 버그를 발견하면 확장자가 `.log`인 파일을 생성하는데, 여기에는 버그를 재현하기 위한 문장(데이터베이스 상태 설정을 위한 다른 문장과 함께 마지막으로 실행된 쿼리만 포함)이 기록됩니다.

**버그 축소.** 버그를 유발하는 테스트 입력을 찾은 후에는 일반적으로 해당 입력을 축소하여 추가 분석해야 합니다. 버그를 재현하는 데 중복되는 SQL 문이 많을 수 있기 때문입니다. 수동으로 이 작업을 수행하는 방법은 한 번에 하나의 문장이나 기능을 제거하고, 버그 유발 문장을 재생하며 테스트 오라클(예: TLP나 NoREC과 같은 테스트 오라클의 경우 두 쿼리가 여전히 다른 결과를 생성하는지 확인해야 함)을 적용하는 것입니다. 이 과정은 소위 [델타 디버깅 접근 방식](https://www.debuggingbook.org/html/DeltaDebugger.html)을 사용하여 자동화할 수 있습니다. SQLancer에는 `--use-reducer`를 통해 활성화할 수 있는 델타 디버깅 접근 방식의 실험적 구현이 포함되어 있습니다. 과거에는 [C-Reduce](https://embed.cs.utah.edu/creduce/)를 성공적으로 사용한 적이 있으며, C-Reduce에서는 테스트 오라클을 스크립트로 지정하여 실행할 수 있어야 합니다.

**최신 DBMS 버전 테스트.** 대부분의 DBMS에서 SQLancer는 이전 *릴리스* 버전만 지원합니다. 따라서 SQLancer가 발견한 잠재적인 버그는 DBMS의 최신 *개발* 버전에서 이미 수정되었을 수 있습니다. 테스트 중인 DBMS의 개발자가 아니라면, 버그를 보고하기 전에 버그가 여전히 재현되는지 확인하는 것을 권장합니다. SQLancer로 발견한 버그를 보고할 때 SQLancer를 언급해 주시면 감사하겠습니다. 또한 SQLancer 사용 경험이나 관련 사용 사례, 확장에 대한 이야기를 듣게 되어 기쁩니다.

**옵션.** SQLancer는 동작을 사용자 정의할 수 있는 다양한 옵션을 제공합니다. `java -jar sqlancer-*.jar --help`를 실행하면 옵션 목록이 표시되며, 다음과 같은 출력이 출력됩니다:```
Usage: SQLancer [options] [command] [command options]
  Options:
    --ast-reducer-max-steps
      EXPERIMENTAL Maximum steps the AST-based reducer will do
      Default: -1
    --ast-reducer-max-time
      EXPERIMENTAL Maximum time duration (secs) the statement reducer will do
      Default: -1
    --canonicalize-sql-strings
      Should canonicalize query string (add ';' at the end
      Default: true
    --constant-cache-size
      Specifies the size of the constant cache. This option only takes effect
      when constant caching is enabled
      Default: 100
...

사용할 SQLancer 버전. SQLancer를 사용하는 권장 방법은 GitHub의 최신 소스 버전을 사용하는 것입니다. 드물고 불규칙한 공식 릴리스는 다음 플랫폼에서도 제공됩니다:

  • GitHub
  • Maven Central
  • DockerHub

SQL 생성 이해하기. 버그를 유발하는 구문을 분석하려면 SQLancer의 특성을 이해하는 것이 도움이 됩니다. 첫째, SQLancer는 테스트 대상 DBMS에 대해 항상 구문적으로 유효한 SQL 문을 생성할 것으로 예상됩니다. 따라서 구문 오류는 절대 관찰되지 않아야 합니다. 둘째, SQLancer는 의미적으로 유효하지 않은 문을 생성할 수 있습니다. 예를 들어, SQLancer는 UNIQUE 제약 조건이 있는 열에 중복 값을 삽입하려고 시도할 수 있습니다. 이러한 의미적 오류를 완전히 피하는 것은 어렵기 때문입니다. 셋째, SQLancer가 보고하는 모든 버그는 실제 버그여야 합니다. 단, CERT가 보고한 경우는 예외입니다 (성능 문제는 다른 종류의 버그만큼 명확하게 정의되지 않기 때문). SQLancer가 버그로 표시했지만 버그라고 생각하지 않는 경우, 설정에 문제가 있을 가능성이 높습니다. 마지막으로, 앞서 언급한 점과 관련하여 SQLancer는 DBMS 버전에 특화되어 있으며, GitHub Actions 워크플로우에서 테스트 중인 버전을 확인할 수 있습니다. 다른 버전에 대해 테스트하는 경우 다양한 오탐(false alarms)이 관찰될 수 있습니다(예: 구문 오류로 인한). SQLancer가 항상 각 DBMS의 최신 개발 버전과 동기화되기를 바라지만, 이를 달성할 리소스가 부족합니다.

지원되는 DBMS. SQLancer는 지원하는 각 DBMS에 대해 DBMS별 코드가 필요합니다. 2025년 1월 기준으로, Citus, ClickHouse, CockroachDB, Databend, (Apache) DataFusion, (Apache) Doris, DuckDB, H2, HSQLDB, MariaDB, Materialize, MySQL, OceanBase, PostgreSQL, Presto, QuestDB, SQLite3, TiDB, 및 YugabyteDB를 지원합니다. 각 DBMS의 지원 정도는 여기에서 다릅니다.

접근법 및 논문

SQLancer는 아래에 시간순으로 설명된 여러 DBMS 테스트 접근법을 개척하고 포함시켰습니다.

도구 다운로드