一、概要

SQLancer

SQLancer是一种自动测试数据库管理系统(DBMS)的工具,用于发现其实现中的错误。也就是说,它在DBMS实现的代码中查找错误,而不是在用户编写的查询中查找错误。SQLancer已经在成熟且广为人知的DBMS中发现了数百个bug。

Manuel Rigger

Manuel Rigger 是新加坡国立大学计算机学院计算学部的一位助理教授,领导着 TEST 实验室,该实验室隶属于编程语言与软件工程组。‌

在具体项目上,他主导开发了 ‌SQLancer‌ 工具,这是一个用于自动测试数据库管理系统的框架。通过该工具,他的团队已发现并报告了数百个关键数据库系统中的独特漏洞,该工具在学术界和工业界均有广泛应用。‌

Manuel Rigger的主页见参考[2]。

模糊测试相关介绍见参考[4],[5]。

二、环境

PostgreSQL v12以上版本测试,报告以下错误:

ERROR:  character number must be positive
ERROR:  cannot specify storage parameters for a partitioned table
ERROR:  partitioned tables cannot be unlogged

三、编译安装

准备编译环境

要求:

JDK可以直接安装openjdk:

yum install java-11-openjdk

配置PATH:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64/
export PATH=$JAVA_HOME/bin:$PATH

CentOS 7.6默认源安装的maven版本过低,不满足要求,可以从maven官网(见参考[3])下载大于3.2.5版或最新版。

image

下载后,解压缩,放到可以访问的路径,然后将路径加到PATH中即可,例如:

export PATH=/opt/apache-maven-3.9.12/bin/:$PATH

验证mvn和JDK配置是否正确:

snippet.bash
$ mvn --version
Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1)
Maven home: /opt/apache-maven-3.9.12
Java version: 11.0.23, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

安装PostgreSQL

请自行安装PostgreSQL 12,过程略。

本文示例PostgreSQL 12从源码自行编译安装,端口为7404,用户名yz

注意:需要为PostgreSQL创建一个名为“test”的database,否则,后续执行sqlancer时将报以下错误:

SQLancer failed creating a test database, indicating that SQLancer might have failed connecting to the DBMS. In order to change the username, password, host and port, you can use the --username, --password, --host and --port options.

org.postgresql.util.PSQLException: FATAL: database "test" does not exist
……

获取SQLancer源码

snippet.bash
git clone https://github.com/sqlancer/sqlancer
cd sqlancer
# 使用稳定分支:
git checkout v2.0.0

编译

mvn package -DskipTests

编译后,jar包及其依赖在target目录下,目录内容如下:

snippet.bash
$ ll target/
drwxrwxr-x 2 yz yz        28 1223 09:13 antrun
drwxrwxr-x 4 yz yz        38 1223 09:11 classes
drwxrwxr-x 3 yz yz        25 1223 09:11 generated-sources
drwxrwxr-x 3 yz yz        30 1223 09:11 generated-test-sources
drwxrwxr-x 2 yz yz     16384 1223 09:27 lib
drwxrwxr-x 2 yz yz        28 1223 09:13 maven-archiver
drwxrwxr-x 3 yz yz        35 1223 09:11 maven-status
-rw-rw-r-- 1 yz yz   1810281 1223 09:27 sqlancer-2.0.0.jar
drwxrwxr-x 4 yz yz        38 1223 09:11 test-classes

需要说明的是,按照sqlancer默认配置,mvn编译出来的sqlancer-2.0.0.jar包依赖于lib目录,不能单独运行,如果希望将lib目录下的依赖包也打包到一个jar内,则需要修改pom.xml(详见参考[6],[7]),修改内容如下:

snippet.diff
$ git diff
diff --git a/pom.xml b/pom.xml
index b57ed010..51e9bd70 100644
--- a/pom.xml
+++ b/pom.xml
@@ -129,20 +129,29 @@
           </execution>
         </executions>
       </plugin>
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <version>3.2.1</version>
-        <configuration>
-          <archive>
-            <manifest>
-              <addClasspath>true</addClasspath>
-              <classpathPrefix>lib/</classpathPrefix>
-              <mainClass>sqlancer.Main</mainClass>
-            </manifest>
-          </archive>
-        </configuration>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>3.2.0</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <createDependencyReducedPom>false</createDependencyReducedPom>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <mainClass>sqlancer.Main</mainClass>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
       </plugin>
+
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>xml-maven-plugin</artifactId>

四、测试

snippet.bash
# jar在sqlancer/target目录下
cd target
# 直接执行以下命令,将返回命令参数说明:
java -jar sqlancer-2.0.0.jar --help

以下是执行PostgreSQL测试示例:

snippet.bash
$ java -jar sqlancer-2.0.0.jar --port 7404 --username yz --num-queries 10 postgres
[2025/12/24 17:05:44] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements:  0%). Threads shut down: 0.
[2025/12/24 17:05:49] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 71%). Threads shut down: 0.
[2025/12/24 17:05:54] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 76%). Threads shut down: 0.
[2025/12/24 17:05:59] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 78%). Threads shut down: 0.
……

五、参考