pg_snakeoil

pg_snakeoil

pg_snakeoil : The PostgreSQL Antivirus

Overview

IDExtensionPackageVersionCategoryLicenseLanguage
7380
pg_snakeoil
pg_snakeoil
1.4
SEC
PostgreSQL
C
AttributeHas BinaryHas LibraryNeed LoadHas DDLRelocatableTrusted
--sLd-r
No
Yes
Yes
Yes
yes
no
Relationships
See Also
pg_crash
pg_cheat_funcs
pg_dirtyread
pg_savior
pg_surgery
pageinspect
pg_catcheck
amcheck

require clamV libs

Packages

TypeRepoVersionPG Major CompatibilityPackage PatternDependencies
EXT
MIXED
1.4
18
17
16
15
14
pg_snakeoil-
RPM
PIGSTY
1.4
18
17
16
15
14
pg_snakeoil_$v-
DEB
PGDG
1.4
18
17
16
15
14
postgresql-$v-snakeoil-
Linux / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
el8.aarch64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
el9.x86_64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
el9.aarch64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
el10.x86_64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
el10.aarch64
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
PIGSTY 1.4
d12.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d12.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d13.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d13.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u22.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u22.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u24.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u24.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PackageVersionOSORGSIZEFile URL
pg_snakeoil_181.4el8.x86_64pigsty16.1 KiBpg_snakeoil_18-1.4-1PIGSTY.el8.x86_64.rpm
pg_snakeoil_181.4el8.x86_64pgdg15.3 KiBpg_snakeoil_18-1.4-1PGDG.rhel8.x86_64.rpm
pg_snakeoil_181.4el8.aarch64pigsty16.2 KiBpg_snakeoil_18-1.4-1PIGSTY.el8.aarch64.rpm
pg_snakeoil_181.4el8.aarch64pgdg15.2 KiBpg_snakeoil_18-1.4-1PGDG.rhel8.aarch64.rpm
pg_snakeoil_181.4el9.x86_64pigsty16.1 KiBpg_snakeoil_18-1.4-1PIGSTY.el9.x86_64.rpm
pg_snakeoil_181.4el9.x86_64pgdg15.5 KiBpg_snakeoil_18-1.4-1PGDG.rhel9.x86_64.rpm
pg_snakeoil_181.4el9.aarch64pigsty16.0 KiBpg_snakeoil_18-1.4-1PIGSTY.el9.aarch64.rpm
pg_snakeoil_181.4el9.aarch64pgdg15.1 KiBpg_snakeoil_18-1.4-1PGDG.rhel9.aarch64.rpm
pg_snakeoil_181.4el10.x86_64pigsty16.1 KiBpg_snakeoil_18-1.4-1PIGSTY.el10.x86_64.rpm
pg_snakeoil_181.4el10.aarch64pigsty16.1 KiBpg_snakeoil_18-1.4-1PIGSTY.el10.aarch64.rpm
postgresql-18-snakeoil1.4d12.x86_64pgdg16.9 KiBpostgresql-18-snakeoil_1.4-3.pgdg12+2_amd64.deb
postgresql-18-snakeoil1.4d12.aarch64pgdg16.4 KiBpostgresql-18-snakeoil_1.4-3.pgdg12+2_arm64.deb
postgresql-18-snakeoil1.4d13.x86_64pgdg16.8 KiBpostgresql-18-snakeoil_1.4-3.pgdg13+1_amd64.deb
postgresql-18-snakeoil1.4d13.aarch64pgdg16.4 KiBpostgresql-18-snakeoil_1.4-3.pgdg13+1_arm64.deb
postgresql-18-snakeoil1.4u22.x86_64pgdg16.6 KiBpostgresql-18-snakeoil_1.4-3.pgdg22.04+1_amd64.deb
postgresql-18-snakeoil1.4u22.aarch64pgdg16.4 KiBpostgresql-18-snakeoil_1.4-3.pgdg22.04+1_arm64.deb
postgresql-18-snakeoil1.4u24.x86_64pgdg16.9 KiBpostgresql-18-snakeoil_1.4-3.pgdg24.04+1_amd64.deb
postgresql-18-snakeoil1.4u24.aarch64pgdg16.4 KiBpostgresql-18-snakeoil_1.4-3.pgdg24.04+1_arm64.deb
PackageVersionOSORGSIZEFile URL
pg_snakeoil_171.4el8.x86_64pigsty16.1 KiBpg_snakeoil_17-1.4-1PIGSTY.el8.x86_64.rpm
pg_snakeoil_171.4el8.x86_64pgdg15.4 KiBpg_snakeoil_17-1.4-1PGDG.rhel8.x86_64.rpm
pg_snakeoil_171.4el8.aarch64pigsty16.2 KiBpg_snakeoil_17-1.4-1PIGSTY.el8.aarch64.rpm
pg_snakeoil_171.4el8.aarch64pgdg15.3 KiBpg_snakeoil_17-1.4-1PGDG.rhel8.aarch64.rpm
pg_snakeoil_171.4el9.x86_64pigsty16.2 KiBpg_snakeoil_17-1.4-1PIGSTY.el9.x86_64.rpm
pg_snakeoil_171.4el9.x86_64pgdg15.6 KiBpg_snakeoil_17-1.4-1PGDG.rhel9.x86_64.rpm
pg_snakeoil_171.4el9.aarch64pigsty16.0 KiBpg_snakeoil_17-1.4-1PIGSTY.el9.aarch64.rpm
pg_snakeoil_171.4el9.aarch64pgdg15.1 KiBpg_snakeoil_17-1.4-1PGDG.rhel9.aarch64.rpm
pg_snakeoil_171.4el10.x86_64pigsty16.1 KiBpg_snakeoil_17-1.4-1PIGSTY.el10.x86_64.rpm
pg_snakeoil_171.4el10.x86_64pgdg15.9 KiBpg_snakeoil_17-1.4-1PGDG.rhel10.x86_64.rpm
pg_snakeoil_171.4el10.aarch64pigsty16.2 KiBpg_snakeoil_17-1.4-1PIGSTY.el10.aarch64.rpm
pg_snakeoil_171.4el10.aarch64pgdg15.8 KiBpg_snakeoil_17-1.4-1PGDG.rhel10.aarch64.rpm
postgresql-17-snakeoil1.4d12.x86_64pgdg16.9 KiBpostgresql-17-snakeoil_1.4-3.pgdg12+2_amd64.deb
postgresql-17-snakeoil1.4d12.aarch64pgdg16.4 KiBpostgresql-17-snakeoil_1.4-3.pgdg12+2_arm64.deb
postgresql-17-snakeoil1.4d13.x86_64pgdg16.8 KiBpostgresql-17-snakeoil_1.4-3.pgdg13+1_amd64.deb
postgresql-17-snakeoil1.4d13.aarch64pgdg16.4 KiBpostgresql-17-snakeoil_1.4-3.pgdg13+1_arm64.deb
postgresql-17-snakeoil1.4u22.x86_64pgdg17.1 KiBpostgresql-17-snakeoil_1.4-3.pgdg22.04+1_amd64.deb
postgresql-17-snakeoil1.4u22.aarch64pgdg17.0 KiBpostgresql-17-snakeoil_1.4-3.pgdg22.04+1_arm64.deb
postgresql-17-snakeoil1.4u24.x86_64pgdg16.9 KiBpostgresql-17-snakeoil_1.4-3.pgdg24.04+1_amd64.deb
postgresql-17-snakeoil1.4u24.aarch64pgdg16.4 KiBpostgresql-17-snakeoil_1.4-3.pgdg24.04+1_arm64.deb
PackageVersionOSORGSIZEFile URL
pg_snakeoil_161.4el8.x86_64pigsty16.1 KiBpg_snakeoil_16-1.4-1PIGSTY.el8.x86_64.rpm
pg_snakeoil_161.4el8.x86_64pgdg15.4 KiBpg_snakeoil_16-1.4-1PGDG.rhel8.x86_64.rpm
pg_snakeoil_161.4el8.aarch64pigsty16.2 KiBpg_snakeoil_16-1.4-1PIGSTY.el8.aarch64.rpm
pg_snakeoil_161.4el8.aarch64pgdg15.2 KiBpg_snakeoil_16-1.4-1PGDG.rhel8.aarch64.rpm
pg_snakeoil_161.4el9.x86_64pigsty16.2 KiBpg_snakeoil_16-1.4-1PIGSTY.el9.x86_64.rpm
pg_snakeoil_161.4el9.x86_64pgdg15.6 KiBpg_snakeoil_16-1.4-1PGDG.rhel9.x86_64.rpm
pg_snakeoil_161.4el9.aarch64pigsty16.0 KiBpg_snakeoil_16-1.4-1PIGSTY.el9.aarch64.rpm
pg_snakeoil_161.4el9.aarch64pgdg15.1 KiBpg_snakeoil_16-1.4-1PGDG.rhel9.aarch64.rpm
pg_snakeoil_161.4el10.x86_64pigsty16.1 KiBpg_snakeoil_16-1.4-1PIGSTY.el10.x86_64.rpm
pg_snakeoil_161.4el10.x86_64pgdg15.9 KiBpg_snakeoil_16-1.4-1PGDG.rhel10.x86_64.rpm
pg_snakeoil_161.4el10.aarch64pigsty16.2 KiBpg_snakeoil_16-1.4-1PIGSTY.el10.aarch64.rpm
pg_snakeoil_161.4el10.aarch64pgdg15.8 KiBpg_snakeoil_16-1.4-1PGDG.rhel10.aarch64.rpm
postgresql-16-snakeoil1.4d12.x86_64pgdg16.9 KiBpostgresql-16-snakeoil_1.4-3.pgdg12+2_amd64.deb
postgresql-16-snakeoil1.4d12.aarch64pgdg16.4 KiBpostgresql-16-snakeoil_1.4-3.pgdg12+2_arm64.deb
postgresql-16-snakeoil1.4d13.x86_64pgdg16.8 KiBpostgresql-16-snakeoil_1.4-3.pgdg13+1_amd64.deb
postgresql-16-snakeoil1.4d13.aarch64pgdg16.4 KiBpostgresql-16-snakeoil_1.4-3.pgdg13+1_arm64.deb
postgresql-16-snakeoil1.4u22.x86_64pgdg17.1 KiBpostgresql-16-snakeoil_1.4-3.pgdg22.04+1_amd64.deb
postgresql-16-snakeoil1.4u22.aarch64pgdg17.0 KiBpostgresql-16-snakeoil_1.4-3.pgdg22.04+1_arm64.deb
postgresql-16-snakeoil1.4u24.x86_64pgdg16.9 KiBpostgresql-16-snakeoil_1.4-3.pgdg24.04+1_amd64.deb
postgresql-16-snakeoil1.4u24.aarch64pgdg16.4 KiBpostgresql-16-snakeoil_1.4-3.pgdg24.04+1_arm64.deb
PackageVersionOSORGSIZEFile URL
pg_snakeoil_151.4el8.x86_64pigsty16.3 KiBpg_snakeoil_15-1.4-1PIGSTY.el8.x86_64.rpm
pg_snakeoil_151.4el8.x86_64pgdg15.5 KiBpg_snakeoil_15-1.4-1PGDG.rhel8.x86_64.rpm
pg_snakeoil_151.4el8.aarch64pigsty16.3 KiBpg_snakeoil_15-1.4-1PIGSTY.el8.aarch64.rpm
pg_snakeoil_151.4el8.aarch64pgdg15.4 KiBpg_snakeoil_15-1.4-1PGDG.rhel8.aarch64.rpm
pg_snakeoil_151.4el9.x86_64pigsty16.3 KiBpg_snakeoil_15-1.4-1PIGSTY.el9.x86_64.rpm
pg_snakeoil_151.4el9.x86_64pgdg15.8 KiBpg_snakeoil_15-1.4-1PGDG.rhel9.x86_64.rpm
pg_snakeoil_151.4el9.aarch64pigsty16.2 KiBpg_snakeoil_15-1.4-1PIGSTY.el9.aarch64.rpm
pg_snakeoil_151.4el9.aarch64pgdg15.3 KiBpg_snakeoil_15-1.4-1PGDG.rhel9.aarch64.rpm
pg_snakeoil_151.4el10.x86_64pigsty16.3 KiBpg_snakeoil_15-1.4-1PIGSTY.el10.x86_64.rpm
pg_snakeoil_151.4el10.x86_64pgdg16.1 KiBpg_snakeoil_15-1.4-1PGDG.rhel10.x86_64.rpm
pg_snakeoil_151.4el10.aarch64pigsty16.4 KiBpg_snakeoil_15-1.4-1PIGSTY.el10.aarch64.rpm
pg_snakeoil_151.4el10.aarch64pgdg16.0 KiBpg_snakeoil_15-1.4-1PGDG.rhel10.aarch64.rpm
postgresql-15-snakeoil1.4d12.x86_64pgdg17.0 KiBpostgresql-15-snakeoil_1.4-3.pgdg12+2_amd64.deb
postgresql-15-snakeoil1.4d12.aarch64pgdg16.5 KiBpostgresql-15-snakeoil_1.4-3.pgdg12+2_arm64.deb
postgresql-15-snakeoil1.4d13.x86_64pgdg17.0 KiBpostgresql-15-snakeoil_1.4-3.pgdg13+1_amd64.deb
postgresql-15-snakeoil1.4d13.aarch64pgdg16.6 KiBpostgresql-15-snakeoil_1.4-3.pgdg13+1_arm64.deb
postgresql-15-snakeoil1.4u22.x86_64pgdg17.2 KiBpostgresql-15-snakeoil_1.4-3.pgdg22.04+1_amd64.deb
postgresql-15-snakeoil1.4u22.aarch64pgdg17.2 KiBpostgresql-15-snakeoil_1.4-3.pgdg22.04+1_arm64.deb
postgresql-15-snakeoil1.4u24.x86_64pgdg17.0 KiBpostgresql-15-snakeoil_1.4-3.pgdg24.04+1_amd64.deb
postgresql-15-snakeoil1.4u24.aarch64pgdg16.5 KiBpostgresql-15-snakeoil_1.4-3.pgdg24.04+1_arm64.deb
PackageVersionOSORGSIZEFile URL
pg_snakeoil_141.4el8.x86_64pigsty16.3 KiBpg_snakeoil_14-1.4-1PIGSTY.el8.x86_64.rpm
pg_snakeoil_141.4el8.x86_64pgdg15.5 KiBpg_snakeoil_14-1.4-1PGDG.rhel8.x86_64.rpm
pg_snakeoil_141.4el8.aarch64pigsty16.3 KiBpg_snakeoil_14-1.4-1PIGSTY.el8.aarch64.rpm
pg_snakeoil_141.4el8.aarch64pgdg15.4 KiBpg_snakeoil_14-1.4-1PGDG.rhel8.aarch64.rpm
pg_snakeoil_141.4el9.x86_64pigsty16.3 KiBpg_snakeoil_14-1.4-1PIGSTY.el9.x86_64.rpm
pg_snakeoil_141.4el9.x86_64pgdg15.8 KiBpg_snakeoil_14-1.4-1PGDG.rhel9.x86_64.rpm
pg_snakeoil_141.4el9.aarch64pigsty16.2 KiBpg_snakeoil_14-1.4-1PIGSTY.el9.aarch64.rpm
pg_snakeoil_141.4el9.aarch64pgdg15.3 KiBpg_snakeoil_14-1.4-1PGDG.rhel9.aarch64.rpm
pg_snakeoil_141.4el10.x86_64pigsty16.3 KiBpg_snakeoil_14-1.4-1PIGSTY.el10.x86_64.rpm
pg_snakeoil_141.4el10.x86_64pgdg16.1 KiBpg_snakeoil_14-1.4-1PGDG.rhel10.x86_64.rpm
pg_snakeoil_141.4el10.aarch64pigsty16.4 KiBpg_snakeoil_14-1.4-1PIGSTY.el10.aarch64.rpm
pg_snakeoil_141.4el10.aarch64pgdg16.0 KiBpg_snakeoil_14-1.4-1PGDG.rhel10.aarch64.rpm
postgresql-14-snakeoil1.4d12.x86_64pgdg17.0 KiBpostgresql-14-snakeoil_1.4-3.pgdg12+2_amd64.deb
postgresql-14-snakeoil1.4d12.aarch64pgdg16.5 KiBpostgresql-14-snakeoil_1.4-3.pgdg12+2_arm64.deb
postgresql-14-snakeoil1.4d13.x86_64pgdg17.0 KiBpostgresql-14-snakeoil_1.4-3.pgdg13+1_amd64.deb
postgresql-14-snakeoil1.4d13.aarch64pgdg16.5 KiBpostgresql-14-snakeoil_1.4-3.pgdg13+1_arm64.deb
postgresql-14-snakeoil1.4u22.x86_64pgdg17.2 KiBpostgresql-14-snakeoil_1.4-3.pgdg22.04+1_amd64.deb
postgresql-14-snakeoil1.4u22.aarch64pgdg17.1 KiBpostgresql-14-snakeoil_1.4-3.pgdg22.04+1_arm64.deb
postgresql-14-snakeoil1.4u24.x86_64pgdg17.0 KiBpostgresql-14-snakeoil_1.4-3.pgdg24.04+1_amd64.deb
postgresql-14-snakeoil1.4u24.aarch64pgdg16.5 KiBpostgresql-14-snakeoil_1.4-3.pgdg24.04+1_arm64.deb

Source

pig build pkg pg_snakeoil;		# build rpm

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_snakeoil;		# install via package name, for the active PG version

pig install pg_snakeoil -v 18;   # install for PG 18
pig install pg_snakeoil -v 17;   # install for PG 17
pig install pg_snakeoil -v 16;   # install for PG 16
pig install pg_snakeoil -v 15;   # install for PG 15
pig install pg_snakeoil -v 14;   # install for PG 14

Config this extension to shared_preload_libraries:

shared_preload_libraries = 'pg_snakeoil';

Create this extension with:

CREATE EXTENSION pg_snakeoil;

Usage

pg_snakeoil: ClamAV antivirus scanning for PostgreSQL data

pg_snakeoil provides ClamAV virus scanning of data stored in PostgreSQL without interfering with normal database operations.

CREATE EXTENSION pg_snakeoil;

Functions

FunctionReturnsDescription
so_is_infected(text)boolCheck if text data matches a virus signature
so_is_infected(bytea)boolCheck if bytea data matches a virus signature
so_virus_name(text)textReturn virus name if infected, empty string otherwise
so_virus_name(bytea)textReturn virus name if infected, NULL otherwise
so_update_signatures()boolReload virus signatures, true if changed

Ad-hoc Scanning

SELECT so_is_infected('Not a virus!');
-- f

SELECT so_is_infected('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*');
-- t

SELECT so_virus_name('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*');
-- Eicar-Test-Signature

On-Access Protection with Domains

CREATE DOMAIN safe_text AS text CHECK (NOT so_is_infected(value));
CREATE TABLE t1 (safe safe_text);

INSERT INTO t1 VALUES ('This text is safe!');
-- INSERT

INSERT INTO t1 VALUES('X5O!P%@AP...');
-- NOTICE: Virus found: Eicar-Test-Signature
-- ERROR: value for domain safe_text violates check constraint "safe_text_check"

On-Access Protection with Triggers

CREATE OR REPLACE FUNCTION check_virus() RETURNS trigger AS $$
BEGIN
    IF so_is_infected(NEW.content) THEN
        RAISE EXCEPTION 'Virus detected: %', so_virus_name(NEW.content);
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER virus_check BEFORE INSERT OR UPDATE ON uploads
    FOR EACH ROW EXECUTE FUNCTION check_virus();
Last updated on