Kliper handles sensitive compliance evidence — firewall configurations, access control policies, network diagrams, cardholder data flow documentation. The platform enforces a multi-layered security pipeline on every uploaded file and provides clear boundaries around how AI processes your data.
File Integrity — SHA-256 Hashing
Every file uploaded to Kliper is cryptographically hashed using SHA-256 at the moment of upload, before it is written to storage.
How It Works
- The file buffer is received in memory via the upload endpoint.
- A SHA-256 hash is computed immediately using Node.js
crypto.createHash('sha256'). - The resulting 64-character lowercase hex digest is stored alongside the file record in the database (
hash_sha256column). - The file is then written to self-hosted Supabase Storage.
On-Demand Integrity Verification
At any point after upload, an authorized user can trigger an integrity verification check via the Verify action. The platform:
- Re-downloads the file from storage.
- Recomputes the SHA-256 hash of the downloaded content.
- Compares the recomputed hash against the stored original.
- Records the result (
verifiedortampered) along with a timestamp in the file’s metadata.
This guarantees that evidence has not been altered in storage — a critical requirement for audit trail credibility during PCI DSS assessments.
What the Assessor Sees
| Field | Value |
|---|---|
| Stored Hash | a3f2b8c1d4e5... (64-char hex) |
| Current Hash | Recomputed on verification |
| Integrity Status | Verified or Tampered |
| Verified At | ISO 8601 timestamp |
Malware Scanning — Dual-Engine Pipeline
Every file passes through a dual-engine malware scanning pipeline before it is accepted into the platform. No file reaches an assessor’s workbench without being scanned.
Scan Pipeline
The pipeline runs three checks in sequence, plus two scanners in parallel:
Static Analysis
Before any scanning, the file undergoes static validation:
- MIME type check — blocked types include executables (
.exe,.dll), scripts (.bat,.sh,.ps1), Java archives (.jar,.class), and 30+ other dangerous MIME types. - Extension check — 40+ blocked extensions including
.exe,.dll,.bat,.cmd,.vbs,.ps1,.msi,.scr,.lnk,.hta, and more. - Magic bytes inspection — the first bytes of the file are compared against known executable signatures (PE/MZ headers, ELF binaries, Mach-O binaries, Java class files). This catches files that have been renamed with a safe extension but contain executable content.
- MIME mismatch detection — warns when the declared MIME type does not match the file’s actual content signature.
Files that fail static analysis are immediately rejected with a 422 status and a quarantined scan status. They are never written to storage.
ClamAV Antivirus Scan
The file is written to a secure temporary location and scanned by ClamAV (clamdscan) with a 30-second timeout. ClamAV is an open-source antivirus engine with regularly updated virus definitions.
- Clean result — no threats detected.
- Infected result — one or more virus signatures identified. The specific virus names are captured and stored.
- Error result — scanner unavailable (logged as a warning). If a required scanner can’t complete, the file is held as
pendingrather than accepted — a ClamAV failure is not silently treated as clean.
VirusTotal Hash Lookup
In parallel with ClamAV, the file’s SHA-256 hash is checked against the VirusTotal database via API. This cross-references the file against 70+ antivirus engines without uploading the file itself — only the hash is sent.
- Clean result —
0/Nengines flagged the hash. - Infected result — one or more engines flagged the hash. Detection count, engine names, and threat names are recorded.
- Not found — hash not in VirusTotal’s database (file has never been scanned globally). This is treated as clean — absence of evidence is not evidence of malice.
Scan Statuses
| Status | Meaning |
|---|---|
clean |
File passed all scan engines with no detections. |
quarantined |
File was blocked by static analysis or flagged by one or more scan engines. File is rejected and not stored. |
pending |
A scan could not complete (e.g. a scanner was unavailable). The file is held in this state — it is not treated as clean. |
Scan Results Storage
Full scan results are persisted in the scan_result JSON column on the file record. Each engine’s individual result is stored:
{
"engines": [
{
"name": "ClamAV",
"status": "clean",
"detail": "No threats detected"
},
{
"name": "VirusTotal",
"status": "clean",
"detail": "0/72 engines flagged",
"permalink": "https://www.virustotal.com/gui/file/a3f2b8c1...",
"detections": 0,
"totalEngines": 72
}
],
"scanned_at": "2026-02-28T14:30:00.000Z"
}Assessors can view per-engine scan results directly in the Attachments Panel of the assessment workbench.
File Type Restrictions
Kliper accepts common evidence file types and blocks anything that could execute code:
- Documents — PDF, DOCX, DOC, XLSX, XLS, PPTX, PPT, VSDX
- Images — PNG, JPG, JPEG, GIF, BMP, TIFF, SVG, WebP
- Text — TXT, CSV, JSON, XML, YAML, LOG, MD, HTML, SQL, CONF, INI
- Certificates — PEM, CRT, CER, KEY, PUB, CSR, P12, PFX
- Archives — ZIP (inspected for Java archives)
- Logs — EVTX (Windows Event Logs)
- Executables —
.exe,.dll,.com,.scr,.pif,.so,.dylib - Scripts —
.bat,.cmd,.vbs,.vbe,.js,.jse,.ps1,.sh,.bash,.csh - Windows system —
.msi,.msp,.mst,.cpl,.hta,.inf,.reg,.scf,.lnk - Java —
.jar,.class - Shell —
.ws,.wsf,.wsc,.wsh
Automatic Metadata Extraction
On upload, Kliper automatically extracts metadata from supported file types to provide assessors with a preview before opening the file:
| File Type | Extracted Metadata |
|---|---|
| Page count, word count, text preview (first 500 chars), document metadata | |
| Word (DOCX/DOC) | Word count, text preview |
| Excel (XLSX/XLS) | Sheet names, row/column counts, header names |
| PowerPoint (PPTX) | Slide count, text preview from first slide |
| Visio (VSDX) | Page count, text labels extracted from diagram elements |
| CSV | Column headers, row count, first 3 rows as preview |
| Images | Format, file size |
| Text/Config files | Line count, word count, text preview |
| Certificates (PEM) | Certificate type (certificate, private key, public key, CSR) |
This metadata is stored in the file record and displayed in the Attachments Panel, giving assessors immediate context about uploaded evidence without downloading each file.
Cortex AI — Privacy and Data Handling
Cortex is Kliper’s built-in AI assistant. Its conversational agent and document extraction run on OpenAI (GPT-5 family), as do the autofill, document validation, and file summary features. Before any text is sent to the provider, a PII-redaction layer removes IP addresses, emails, payment card numbers (Luhn-validated), phone numbers, and SSNs — so no cardholder data or personal identifiers reach the model. Enterprise organizations can additionally run Cortex under their own OpenAI agreement (bring-your-own key) or their own self-hosted model endpoint — see Choosing Your AI Provider. A self-hosted platform profile also remains available for deployments with strict data-residency requirements.
What Cortex Can Access
Cortex operates within strict boundaries:
- Assessment context only — Cortex can only see data from the assessment the user is currently working in. It cannot access other assessments, other clients, or other organizations.
- Requirement-scoped — when invoked on a specific testing procedure, Cortex receives only the relevant reporting instructions, the assessor’s existing responses for that requirement, and the names of uploaded evidence files tagged to that requirement.
- No raw file content by default — Cortex receives file names and AI-generated summaries of file content, not the raw file contents. The only exception is the Document Validation feature, which sends extracted text content (up to 30,000 characters) to the AI for criteria-based validation.
What Cortex Cannot Do
- Cannot access data across organizations — tenant isolation is enforced at the API level.
- Cannot store or learn from your data — OpenAI API data is not used to train models (enterprise privacy), and Kliper sends prompts only after PII redaction.
- Cannot make assessment decisions — Cortex generates draft text and validation results. The assessor retains full control over all findings, status selections, and the final report content.
- Cannot modify assessment answers directly — all AI-generated content is presented as suggestions that the assessor must explicitly accept or modify.
Data Flow
AI Transparency
Every AI-generated output in Kliper includes:
- Warnings — if data is missing (e.g., no assessor responses yet, no evidence files uploaded), Cortex explicitly flags what is incomplete rather than fabricating content.
- Placeholders — for data that does not yet exist, Cortex uses
[PENDING_RESPONSE]or[TAG]markers instead of generating plausible-sounding but unverified text. - Model attribution — the AI model used and token counts are recorded for every validation and autofill operation.
- Shows its work — every Cortex reply that consulted your data exposes a “How this answer was produced” trace, listing exactly which requirements, evidence, and knowledge-base sources it read before drafting. Reviewers can verify the AI’s reasoning path, not just its output.
AI-Use Declaration
Kliper gives every assessor a standard AI-use declaration to share with the assessed entity — surfaced in the engagement letter and the client portal, and stated plainly here. It is aligned to the PCI SSC “Integrating AI in PCI Assessments” guidelines:
Session Security
Kliper’s session model follows the NIST SP 800-63B AAL2 profile:
- 8-hour rolling sessions with 1-hour refresh granularity
- 12-hour absolute cap — a session cannot be extended past 12 hours without re-authentication
- 30-minute idle timeout — inactive sessions are logged out
Sessions are cookie-based (HTTP-only, secure) — tokens are never stored in localStorage.
Multi-Tenant Isolation
Kliper enforces strict tenant isolation at every layer:
- Database — every query is scoped to the user’s current organization via the
org_idforeign key. There is no mechanism to query across organizations. - Storage — file paths are prefixed with the organization ID. Signed download URLs are scoped per organization.
- API — the
x-organizationheader is validated on every authenticated request. Requests without a valid organization context are rejected. - RBAC — roles (Admin, Manager, Assessor, QA, Viewer) with fine-grained permissions per resource type and action.
Audit Trail
Every state change in Kliper is recorded in the audit log:
- Who — user ID, name, email.
- What — action type (created, updated, deleted, reviewed, approved).
- When — ISO 8601 timestamp.
- Where — IP address, user agent string.
- Detail — old value and new value snapshots for data modifications.
Audit logs are immutable and queryable from the Admin Dashboard. They are designed to withstand QSA peer review and PCI Council quality assurance inquiries.