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.7k398531일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

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

Build Status

SQLancer

SQLancer는 DBMS(Database Management System)의 구현에서 버그를 찾기 위해 자동으로 테스트하는 도구입니다. 즉, 사용자가 작성한 쿼리가 아닌 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 의존성으로 포함되어 있습니다. 이러한 시스템에서 발생하는 모든 충돌은 SQLancer가 실행되는 JVM의 충돌도 유발한다는 점에 유의하세요.

SQLancer 사용하기

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

버그 축소. 버그를 유발하는 테스트 입력을 찾은 후에는 일반적으로 버그 재현에 불필요한 많은 SQL 문이 포함되어 있을 수 있으므로 추가 분석을 위해 입력을 축소해야 합니다. 한 가지 방법은 한 번에 하나의 문이나 기능을 제거하고, 버그를 유발하는 문들을 재실행하고, 테스트 오라클을 적용하는 수동 작업입니다(예: TLP나 NoREC 같은 테스트 오라클의 경우 두 쿼리가 여전히 다른 결과를 생성하는지 확인해야 합니다). 이 과정은 소위 델타 디버깅 접근법을 사용하여 자동화할 수 있습니다. SQLancer에는 델타 디버깅 접근법의 실험적 구현이 포함되어 있으며, --use-reducer를 사용하여 활성화할 수 있습니다. 과거에 우리는 C-Reduce를 성공적으로 사용한 적이 있는데, 이는 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 워크플로에서 확인할 수 있습니다. 다른 버전에 대해 테스트하는 경우, 다양한 오탐(예: 구문 오류로 인한)이 발생할 수 있습니다. SQLancer가 각 DBMS의 최신 개발 버전과 항상 최신 상태를 유지하기를 바라지만, 이를 달성할 리소스가 부족합니다.

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

접근법 및 논문

SQLancer는 DBMS 테스트를 위한 여러 접근법을 개척하고 포함하고 있으며, 아래에 연대순으로 설명되어 있습니다.

도구 다운로드