PDF /Launch action passes a `javascript:` URL as the /P parameter.
When mshta receives `javascript:...` as its argument, it can execute the script inside its scripting host. This converts the PDF /Launch action into an inline-script execution primitive. Combined with PDF_LAUNCH_MSHTA, this is T1218.005 + T1059.005.
PDF /Launch action specifies an executable target (and optionally parameters).
The /Launch action can run an external program when activated, or on open if paired with an open trigger. The finding records the launched command for display and elevates to CRITICAL when the target references a known-dangerous executable (cmd, PowerShell, etc.).
PDF /Launch action whose /F parameter explicitly names mshta.
Mshta is the Microsoft HTML Application host and a documented LOLBIN. Modern PDF launcher campaigns prefer it because mshta accepts a `javascript:` URL as its /P parameter, which executes inline JScript without requiring a dropper file on disk. The PDF /Launch carrier plus an mshta target is the unambiguous shape of MITRE ATT&CK T1218.005.
An Adobe security notice instructs the user to scan a QR code to unlock a document.
The behavioral finding remains valid when a dense, damaged, or composited QR payload cannot be decoded.
PDF OpenAction JS uses a this.URL-keyed cipher + hex-decode + eval — a known anti-analysis Adobe Reader exploit kit.
Fires when the PDF OpenAction JavaScript contains the fingerprint of a specific anti-analysis Adobe Reader exploit kit: a substitution cipher keyed on this.URL (the delivery filename, extracted via indexOf('rtl')), a decoy fallback key when the URL contains ':' (so sandboxes/static analysis decode to garbage by design), and a parseInt(pair,16)->fromCharCode hex decoder feeding eval. The kit bundles the classic Adobe Reader JavaScript CVEs (CVE-2007-5659, CVE-2008-2992, CVE-2009-0927, CVE-2009-4324, CVE-2010-0188) and selects one at runtime by viewer version. Because the decode key is the runtime delivery URL, the specific CVE is not statically recoverable, so the loader fingerprint attributes the Reader-exploit family at related confidence (which removes it from the unknown-exploit/0-day hunt queue).
PDF embeds a U3D stream behind a /3D annotation set to auto-activate on page view.
CVE-2009-2990 is a heap buffer overflow in Adobe Reader / Acrobat's U3D (Universal 3D, ECMA-363) CLODProgressiveMeshDeclaration parser, patched in APSB09-15 (Reader 9.2 / 8.1.7 / 7.1.4) alongside the sibling FlateDecode-predictor overflow CVE-2009-3459. The exploitable document shape is a /Subtype /3D annotation whose /3DA activation dictionary binds /A /PV with /AIS /I — that combination makes the U3D parser run on page view with no click required. Real-world samples pair this with a 0x0c0c0c0c heap-spray JavaScript that lays a urlmon-based download shellcode at the corrupted allocation. Legitimate 3D PDFs almost never use the auto-activate + JS combination.
OpenAction JavaScript evaluates an annotation subject stage, which then evaluates the annotation author field.
JavaScript uses syncAnnotScan()/getAnnots({nPage:0}) to read annotation fields, resolves an annotation name to eval, evaluates the subject stage, then evaluates getAnnot(0, "eval").author. This sequence implements an annotation payload loader. The getAnnots call is transport glue, not proof of CVE-2009-1492 unless it carries crafted integer-overflow arguments.
PDF JavaScript decodes dash-delimited hex from annotation subjects and evals the result.
Old PDF exploit kits often hide second-stage JavaScript in annotation /Subject fields. The rule requires the full staging shape: OpenAction JavaScript that enumerates annotations, converts dash-delimited hex bytes with String.fromCharCode(), and evals the recovered stage. This avoids flagging ordinary annotations or benign hexadecimal text.
OpenAction JavaScript reads an annotation /Subject payload, rewrites marker bytes into percent escapes, unescapes the result, and dispatches it through eval.
The transport requires an /OpenAction launcher, an annotation /Subj payload, syncAnnotScan/getAnnots annotation enumeration, marker-to-% rewriting, unescape(), and direct or indirect eval dispatch. These conditions identify exploit-kit staging but do not attribute a CVE. Plain getAnnots({nPage:0}) is not enough; CVE-2009-1492 is only assigned by the separate CVE rule when getAnnots() carries crafted integer-overflow or long string arguments.
Numeric string arrays reconstruct a WScript download, file-write, and execution stage.
The radix is inferred within JavaScript's bounded radix range; a finding requires a complete CreateObject, responseBody, SaveToFile, execution, and network chain.
PDF text contains a long base64 blob that decodes to a verified MZ/PE executable payload.
Malicious PDFs may hide a Windows executable as base64 in comments, after %%EOF, or in plain object text rather than as a declared attachment or stream. Decoding to a verified PE header is a strong payload-smuggling indicator.
PDF impersonates a branded invoice workflow but links outside the brand's own domains.
The PDF presents a branded invoice/open/download workflow and routes the victim to a host that is not controlled by the impersonated brand. This keeps the finding focused on the social-engineering behavior, while campaign names and report references should be represented as tags or linked metadata.
Branded invoice PDF links to public cloud object storage with a recipient email parameter.
The PDF presents invoice or service-fee wording for a known brand, but the clickable action points to generic cloud object storage and includes a recipient email parameter. This is a phishing/redirection pattern: legitimate invoices normally route users to the vendor's own portal rather than a personalized object-storage URL.
A corporate presentation or investment lure points to redirect-named object storage.
Requires corporate identity wording, presentation/investment context, an open/view action, and a redirect-labelled cloud tenant; ordinary cloud shares do not match.
PDF shows a corrupted-file/update lure and links to an external URL.
Malicious PDFs often avoid exploiting the reader directly and instead present a fake broken-file or update prompt that sends the victim to a staged payload or credential collection page. The detector requires the specific corrupted-file/update lure text plus an external HTTP(S) target so ordinary linked documents are not convicted.
PDF visible text advertises cracked software, serials, or archive downloads and links to a shortlink/download gateway.
The PDF contains a cracked-software or serial-key lure in visible text and one or a few links to a shortlink or download gateway. Piracy terms part of the URI. It requires both an explicit crack/serial/archive download lure and a shortlink or known encoded download gateway, so ordinary documents that mention downloading software are not affected. The PDF is a social-engineering carrier, not a parser exploit.
PDF carries many game-hack/free-generator PDF links spread across distinct hosts.
The PDF combines a free-generator or game-hack lure with many external PDF links whose filenames advertise hacks, cheats, jailbreaks, generators, or free game currency. The detector requires multiple matching links distributed across several hosts; a game document with an isolated external link does not match.
Piracy/download lure text is paired with links across several unrelated hosts.
The multi-domain gate identifies SEO and redirect carriers while avoiding ordinary manuals or product documents that contain one legitimate vendor download link.
PDF contains DocuSign-themed download/signing lure text and links to a non-DocuSign host.
Credential-phishing PDFs often imitate DocuSign with a fake document/download/signing prompt. The high-signal part is not the brand word alone; it is DocuSign lure text plus a clickable HTTP(S) action whose destination is outside DocuSign-owned domains. Legitimate DocuSign workflows keep the action on DocuSign infrastructure.
A document review/open/sign/install CTA links to a risky delivery or redirect destination.
The rule requires both actionable document-lure language and corroborating infrastructure: a raw IP, shortener, compromised CMS path, generated host, remote Office payload, or a distributed redirector set.
A PDF sends many title-shaped document links through one dynamic-DNS host.
The detector requires at least fifteen outbound links concentrated on one supported dynamic-DNS provider and at least eight paths resembling unrelated titled PDF downloads. That correlated link-farm shape identifies disposable SEO/scam redirector carriers without treating an ordinary dynamic-DNS link as malicious.
Embedded SWF combines native-memory discovery, protection changes, and process execution.
The rule requires independent ActionScript surfaces for locating memory, changing page protections, and invoking a platform payload. It is narrower than matching ByteArray or RichMedia alone and does not guess a CVE.
PDF stream bytes contain an embedded MZ/PE executable payload.
Exploit chains sometimes hide droppers inside ordinary PDF stream bytes rather than as declared /EmbeddedFile attachments. A verified PE header inside a PDF stream is strong staged-payload evidence.
PDF combines /Launch, EmbeddedFiles/EF, and exportDataObject with nLaunch:0.
CVE-2010-1240-style documents match when the attached payload is not a clean PE executable but the Adobe Reader drop-and-launch mechanism is explicit. The rule requires /Launch plus an embedded-file name tree and exportDataObject(... nLaunch:0), which is not a benign attachment workflow.
File starts as a GIF, contains a secondary PDF body, and the carved PDF has JBIG2 stream anomalies consistent with FORCEDENTRY-style CoreGraphics exploitation.
Project Zero's FORCEDENTRY analysis describes CVE-2021-30860 as a fake GIF that routes into the CoreGraphics PDF parser and then exercises a malicious JBIG2 stream. Analyzer only emits this CVE when the wrapper and malicious JBIG2 child indicators are both present, keeping plain scanned-PDF JBIG2 usage out of the CVE bucket.
ML-flagged PDF that also carries a download/call-to-action lure and an off-domain downloadN.php?file=document gateway link.
The mass-generated 'free PDF download' / fake-document family ranks in search results for a lure query, then funnels the victim through an off-domain server-side download gateway (e.g. /download3.php?q=<name>.pdf) to malware, scareware, or ad-fraud redirects. The pages pad themselves with benign decoy links to dilute classifier scores, so the ML hit alone lands only in the suspicious band. The detector reports only on the conjunction of the ML hit, a visual download lure, and the gateway link — a combination benign PDFs essentially never carry — and promotes the verdict to malicious.
PDF links to an Adobe Reader-themed path on a non-Adobe host.
The document contains a clickable web action whose path presents itself as an Adobe Reader download or update endpoint, but the destination host is not Adobe-owned. That pattern is a strong payload-delivery lure: the PDF itself may be simple, while the user is pushed to install or open content from attacker-controlled infrastructure.
Embedded SWF's ActionScript-3 bytecode loads and executes an inner SWF from raw bytes (allowLoadBytesCodeExecution) and/or Vector heap-spray groomers.
The embedded Flash object's ActionScript-3 constant pool (recovered by the SWF/ABC parser) references exploit-loader primitives: LoaderContext.allowLoadBytesCodeExecution (to execute a second-stage SWF decompressed into a ByteArray) and/or Vector.<uint>/Vector.<Number> heap/JIT spray groomers with raw byte writes. Benign Flash content (sound players, scrollable text, Flex widgets) never loads and runs code from raw bytes; this is a staged Flash exploit delivered through the document. The specific Flash CVE lives in the inner second-stage SWF, so attribution stays family-level.
RichMedia PDF pairs obfuscated exploit JavaScript with a ByteArray/loadBytes SWF loader.
The PDF contains exploit-oriented JavaScript and a SWF ABC stage that loads bytes dynamically. This establishes Flash exploit delivery, but no CVE is assigned until a vulnerability-specific ActionScript trigger is recovered.
Foxit Reader Launch-action stack overflow — CVE-2009-0837
critical
CVE_2009_0837
An oversized PDF Launch FileSpec triggers the Foxit Reader 3.0 stack overflow after JavaScript heap-sprays native shellcode.
CORE-2009-0218 documents Foxit Reader copying an Open/Execute filename into a fixed-size stack buffer without a length check. This rule requires the vulnerable Launch/FileSpec shape together with a substitution-decoded heap spray and statically recovered native shellcode, and consolidates the generic component findings into one exact CVE attribution.
An HR, salary, payroll, or signing lure hides its action in a QR code.
The decoded QR URL and any cleartext or Base64 recipient identifier are surfaced with the finding.
PDF stream contains a hidden ZIP archive with executable entries.
PDFs can legitimately carry attachments, but normal attachments are declared through /EmbeddedFile, /EmbeddedFiles, or /EF metadata so the viewer and user can treat them as attachments. The detector looks for the different pattern of raw ZIP local-file headers hidden inside ordinary PDF stream bytes, then only fires when ZIP entry names end in executable payload extensions such as .dll, .exe, .scr, .ps1, .hta, or .lnk. Legitimate reasons for DLLs inside a PDF are very rare; a software manual or PDF portfolio should use explicit attachment metadata, not a concealed stream archive.
The recovered icon-channel JavaScript contains a heap spray and percent-encoded shellcode.
This establishes a memory-corruption exploit independently of its concealment layer, while avoiding an unsupported exact CVE attribution.
A localized image-based open/view button links to a long opaque path on a notification/update-themed host.
Detects sparse image-button doorway PDFs while requiring a suspicious destination shape, rather than treating ordinary image links as malicious.
Image-heavy PDF carries a clickable URL with the recipient email address in a query parameter.
Credential-phishing PDFs often render the visible lure as pixels so text scanners cannot read it, then place one clickable area over the screenshot. When that URL also includes the recipient's email address, the landing page can pre-fill the login form and track the victim. The finding requires both the image-overlay presentation and recipient-specific data in the target URL.
An image-based PDF lure links to a syntactically invalid or unregistered hostname.
The finding correlates a clickable image lure with a destination whose hostname is invalid or whose TLD is absent from the local ICANN suffix data. Unknown reputation alone does not trigger it.
An image-only PDF routes actions through multiple unrelated low-context hosts.
Detects play-button and adult doorway PDFs without attempting unsafe or unreliable semantic image classification.
Sparse image/QR PDF links to generated infrastructure while embedding the recipient email address.
Credential-phishing PDFs often render the lure as pixels or a QR-code workflow, then personalize the landing URL with the victim's email address. The email may be cleartext in the path/query or base64-encoded in an email parameter. The detector requires an image-heavy sparse-text PDF, generated or disposable-looking web infrastructure, and a recipient email embedded in the destination URL.
A /JavaScript action references a stream whose terminal filter is JBIG2Decode.
JBIG2 is legitimate for page images, but routing JBIG2-decoded bytes into a JavaScript action is an exploit-family delivery shape. It is related to legacy Reader JBIG2 exploitation; exact CVE attribution requires a proven malformed JBIG2 segment or arithmetic trigger.
PDF combines JBIG2Decode image streams with JavaScript heap-spray or decoder scaffolding.
The exact CVE-2009-0658 rule requires stronger Reader-version or decoded-shellcode fingerprints. This likely rule requires JBIG2Decode plus exploit-preparation JavaScript such as unescape heap-spray builders, large arrays, fromCharCode decoders, or eval dispatch, which is the static shape of the older Adobe Reader JBIG2 exploit family.
A JavaScript stream abuses a mixed compression/image filter chain with extreme dimensions.
CCITTFaxDecode belongs on monochrome image data, not JavaScript. Requiring a JavaScript action, multiple filters, CCITT, and extreme columns makes this a narrow parser-evasion detector.
A deflated /JS stream inflates into a large blob that is almost entirely whitespace wrapped around a small code core.
Classic JavaScript heap-spray shape: a tiny deflated /JS object expands to megabytes of tabs/spaces/newlines — the spray buffer that positions shellcode at a predictable address before a PDF parser CVE is triggered. Benign PDF JavaScript is never megabytes of whitespace, so this is treated as malicious on its own, even when the inner exploit stage cannot be decoded to an exact CVE.
Acrobat JavaScript decodes biased pixel-channel bits and evaluates the recovered stage.
The detector statically replays the bounded bit packing used with iconStreamFromIcon and carves every recovered JavaScript layer without rendering or executing it.
PDF links to redirector infrastructure used by a known malicious PDF campaign.
The detector matches clickable PDF URIs pointing to known redirector infrastructure from the SEO/adware PDF campaign that used ttraff and related domains. The PDF itself is normally a redirect carrier: user interaction sends the browser through the redirector chain, which can end in unwanted software or malware delivery. This is not evidence of a PDF parser CVE.
PDF /Launch invokes cmd.exe to build a VBS ADODB.Stream/XMLHTTP/FileSystemObject dropper.
CVE-2010-1240 covers Adobe Reader/Acrobat Launch File dialog abuse. This variant does not rely on PDF EmbeddedFiles; instead the Launch command constructs VBS that either reopens the PDF itself and extracts an appended byte range, or downloads a payload with XMLHTTP, saves it via ADODB.Stream/FileSystemObject, and runs it. The rule requires cmd.exe from /Launch plus VBS dropper APIs to avoid tagging ordinary Launch actions.
PDF contains a /Launch action to start an external application.
A Launch action can start an external application when the action is activated, or on open if it is wired to an open trigger. This is a high-risk PDF feature and is useful evidence when reviewing a document.
PDF combines /Launch, EmbeddedFiles/EF, exportDataObject, and embedded executable bytes.
This conservative variant of the CVE-2010-1240 detector covers samples where the Launch dictionary does not expose the strict cmd.exe /Win shape. Requiring all four surfaces keeps benign attachments out while attributing the same drop-and-launch abuse chain.
A PDF wrapper contains a verified Base64 PE and explicitly instructs the user to run it.
The instruction is correlated with a validated executable and must occur in raw content after %%EOF. It identifies manual social-engineering execution without claiming that the PDF viewer automatically launches the payload or renders the instruction.
Microsoft Edge generator-constructor CSP bypass — CVE-2016-3198
critical
CVE_2016_3198
Document JavaScript matches the CVE-2016-3198 generator-constructor CSP bypass pattern.
The script nulls the generator-function prototype constructor and then invokes the generator constructor to inject script or iframe markup from a crafted document context. The paired operations distinguish the exploit PoC from ordinary generator-function use.
Trailing HTML reconstructs a remote script URL from transformed RGB values.
Executable HTML was appended outside the normal PDF object graph and hides a remote script source behind a constant byte transform. This is polyglot-style malicious delivery rather than ordinary PDF content.
Array-indexed JavaScript properties resolve to exportDataObject with nLaunch enabled.
The PDF extracts an embedded attachment and automatically opens it in its registered handler; the child is the next-stage payload.
PDF JS behind nested filters / a custom rolling-XOR decoder de-obfuscates to a heap-spray / ROP chain.
The PDF JavaScript is hidden behind nested stream filter chains (e.g. ASCIIHexDecode/FlateDecode/ASCIIHexDecode) and/or a custom in-JS decoder (a rolling-XOR 'ffts' stager that XORs each byte with a feedback key and evals the result). After the analyzer unwinds those layers, the recovered stage contains a heap-spray / ROP chain (repeated 0c0c/9090/4141 landing words plus shellcode). A spray that only appears after de-obfuscation is never benign — this is an obfuscated multi-stage Adobe Reader JavaScript exploit. ClamAV often labels these by the dropped Windows payload (Win.Trojan.Agent), which is the second stage, not the delivery; the family is attributed at related confidence because the exact Reader CVE trigger may sit in an even deeper layer.
PDF uses document-review CTA wording but links to an unrelated hosted portal.
The PDF asks the reader to review a shared file, proposal, investment document, or corporate documentation, but the click target is an unrelated hosted application, cloud path, or authentication-looking portal. This is a common phishing delivery shape: the PDF is only a lure, and the external portal performs credential collection or redirection.
PDF automatically launches an encoded PowerShell download-and-execute command.
The PDF combines an open-time /Launch action with cmd.exe or PowerShell, a statically decoded UTF-16LE -EncodedCommand, a network download primitive, and a process-execution sink. The rule extracts the decoded script, URL, temporary output path, hidden-window and execution-policy flags, and correlates a chained app.launchURL action when it targets the same payload. This is explicit malware delivery through viewer features, not a PDF parser CVE.
PDF JavaScript contains a cluster of exploit-like primitives.
Multiple suspicious JavaScript primitives appear together, such as heap-spray construction, obfuscation, vulnerable API use, or staged decoding. The cluster requires more than one primitive before reporting the cluster.
PDF JavaScript behavior: PDF JavaScript Shellcode Behavior.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF structural or payload evidence: PDF Launch Plus Dropper JavaScript.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF VBS Hex PE Dropper.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF XFA behavior: PDF XFA Heap Spray.
The PDF contains XFA form content associated with script execution, heap spray behavior, or staged payload recovery.
Acrobat JavaScript prompts for credential-like input and places it in a network request.
This is malicious credential harvesting through supported scripting features rather than memory-corruption exploitation.
PDF JavaScript reconstructs and evals a hidden stage from every Nth byte of an embedded file.
The JavaScript reads a declared PDF EmbeddedFile with getDataObjectContents(), converts it with util.stringFromStream(), takes characters at a fixed stride, and evaluates the reconstructed stage. Evaluation of attachment bytes is executable staging behavior, not normal attachment handling. The decoded stage is carved for review.
Recovered PDF shellcode statically XOR-decodes to a native URLMON downloader and executable launcher.
Requires a bounded x86 call/pop XOR loop plus decoded PEB walking, URLMON and a hardcoded URL. Both stages are carved and no CVE is inferred.
PDF carries >=4 links to .php gateways with a multi-word search-phrase document slug (pharma / binary-options / SEO spam).
Legitimate PHP-served documents use a filename or numeric id, not a multi-word search-query phrase. Four or more links of the shape 'index.php?.../binary+options+trading+nz.pdf' or 'pdf.php/cialis-dosage-side-effects.pdf' — whether spread across hosts or clustered — are a generated SEO link farm that ranks for queries and routes users into payload/redirect chains. The PDF is an inert link carrier; the risk lives in the linked destinations.
Single PDF JavaScript body branches on viewerVersion and invokes multiple Reader CVE sinks.
The 2009-2010 Pidief.J template carries three Reader exploits in one PDF: CVE-2007-5659 (Collab.collectEmailInfo), CVE-2008-2992 (util.printf with a field-width %f format string), and CVE-2009-0927 (Collab.getIcon). A small dispatcher reads app.viewerVersion and fires the matching sink. The rule requires both a viewerVersion switch and two or more distinct CVE sinks in the same JavaScript body, so it doesn't fire on benign code that mentions one of them.
PDF action body contains a PowerShell download-and-execute cradle.
Patterns matched include `Invoke-Expression(Invoke-RestMethod ...)`, `IEX(IRM ...)`, `(New-Object Net.WebClient).DownloadString`, `[Net.WebClient]`, `[Net.ServicePointManager]::SecurityProtocol`, and `powershell -ep Bypass -enc <base64>`. These strings are rare in benign PDFs. Their presence records PowerShell execution and remote retrieval staging (MITRE T1059.001 and T1105).
A PDF Launch action retrieves remote content and pipes it to an IEX-equivalent sink.
The command is decoded from the Launch dictionary, including schemeless hosts and simple string-obfuscated Invoke-Expression forms, and its network target is surfaced as an IOC.
A protected receipt, invoice, or document lure opens an unrelated collaborative-workspace tenant.
Correlates the rendered protected-document prompt with its LarkSuite, Notion, Airtable, Fobizz, or Coda action target.
PDF contains a QR-like image and business-process scan instructions hidden with invisible text characters.
Some QR phishing kits insert zero-width or bidi control characters into words such as contract, QR code, appraisal, compensation, or review. The text renders normally to the recipient but breaks byte-oriented matching. The detector normalizes invisible characters and requires both a QR-like image and business-process scan wording, so ordinary QR codes are not matched on image shape alone.
A sparse recipient-address PDF links to arbitrary hosted infrastructure.
Correlates visible recipient personalization with a user-controlled hosting tenant.
PDF uses invisible/repeated links to deliver a direct payload file.
Repeated invisible link annotations pointing to an archive or executable match malware-delivery PDFs where the visible page is just a lure and the actual payload is downloaded from the linked URL. Lure-like filenames such as document/unlock/verify archives further increase confidence.
A repeated obfuscated link overlay embeds a Base64 recipient address.
Requires at least ten identical search-redirect annotations plus a decodable email recipient, distinguishing targeted overlay phishing from ordinary links.
Small PDF contains many clickable external PDF links clustered on one host.
Generated malicious PDF campaigns often use scraped text and many clickable PDF URLs to make documents appear in search results and route users through attacker-controlled or compromised link farms. The rule is gated on a small file with many external .pdf URI actions clustered on one host to avoid treating ordinary references as malware. This is social-engineering and redirect-chain evidence, not a PDF parser CVE fingerprint.
PDF document JavaScript opens a known search-themed redirector campaign URL.
The detector is constrained to document-level JavaScript that percent-obfuscates a getURL() target under known search-themed redirector infrastructure and a numeric /in.cgi query. The samples are malicious redirect carriers, but the evidence is delivery infrastructure rather than a PDF parser CVE fingerprint.
PDF document JavaScript opens the known SearchGlobalSite redirector campaign URL.
The detector is constrained to document-level JavaScript that percent-obfuscates a getURL() target of searchglobalsite.com/in.cgi?11. The samples are malicious redirect carriers, but the evidence is delivery infrastructure rather than a PDF parser CVE fingerprint.
PDF (or its embedded JavaScript stub) instantiates Shell.Application and calls ShellExecute.
Some PDF readers prompt the user before honouring a /Launch action. Attackers sidestep that prompt by having a JScript stub (typically loaded via mshta as a `javascript:` URL) instantiate the Shell.Application COM object and call ShellExecute to spawn the next-stage process — the reader's /Launch warning may not fire because the spawn happens inside the mshta host, not inside the PDF reader.
A free/full-movie lure links to an unrelated non-media host.
Detects multilingual one-link streaming carriers, including those parked on compromised organization websites.
A constant-alphabet JavaScript decoder reconstructs native shellcode beside an oversized PDF Launch FileSpec.
Requires independent evasion, native-payload, and trigger evidence: a bijective substitution table, recovered shellcode, and a Launch target of at least 4096 bytes. It establishes an exploit chain without guessing a CVE.
PDF JS embeds a SHA-1 routine keyed on the victim's wall-clock minute to XOR-decrypt and eval a payload.
The PDF JavaScript embeds a full inline SHA-1 implementation and derives an XOR key from the victim's wall-clock minute (getHours()+''+getMinutes()); the digest decrypts a small ciphertext array that is then eval'd, with a catch{} block retrying the previous minute for clock-rollover tolerance. The wall-clock keying is a deliberate anti-static / anti-sandbox measure — the decryption key only exists at the victim's open time, so the encrypted stage cannot be recovered by static analysis (~1440 possible minute keys, no validation oracle). The loader construction is nonetheless conclusive: no legitimate PDF hashes the clock to eval code. This is a known pre-2011 PDF exploit-kit loader whose encrypted second stage is an Adobe Reader JavaScript exploit; attributed at related confidence as an exploit-kit family because the exact CVE trigger is time-locked out of view.
PDF combines U3D/3D annotation content with JavaScript heap-spray shellcode.
Public CVE-2011-2462 exploit chains use a crafted U3D stream and JavaScript heap spray to control memory during Adobe Reader's U3D parser memory corruption. The rule requires both U3D/3D content and a heap-spray JavaScript shape, avoiding attribution for ordinary 3D PDFs.
PDF comment text contains a decimal byte array that decodes to a verified MZ/PE executable payload.
Some malicious PDFs hide a Windows executable in commented VB/VBScript-style source lines such as Array(c(077),c(090),...). The detector only fires when that concealed decimal array decodes to a valid MZ/PE header. A numeric array that does not decode to a PE does not match.
PDF JavaScript hides exploit tokens by inserting whitespace between source characters.
A bounded normalization pass recovered executable JavaScript with shellcode or heap-spray markers from an overwhelmingly single-character token stream. This is a deliberate scanner-evasion form, not ordinary JavaScript formatting.
PDF document JavaScript opens the known WwwSearchSites redirector campaign URL.
The detector is constrained to document-level JavaScript that percent-obfuscates a getURL() target of wwwsearchsites.com/in.cgi?10. The samples are malicious redirect carriers, but the evidence is delivery infrastructure rather than a PDF parser CVE fingerprint.
A non-image XFA image payload decodes to command and network shellcode strings.
The hex payload lacks its declared image signature and a single-byte XOR decode reveals process-launch and HTTP indicators, strongly identifying embedded payload code.
PDF JavaScript calls exportDataObject() with nLaunch set, extracting and launching the document's embedded file on open.
exportDataObject({cName:..., nLaunch:2}) writes the PDF's embedded file to a temp folder and opens it in its default handler — a launch-on-open dropper. The embedded file is the real payload (commonly a VelvetSweatshop-encrypted Office document wrapping an Equation Editor exploit, or a script/executable). Automatic launch of an extracted attachment constitutes executable payload delivery.
PDF defines an /OpenAction whose target object cannot be reached by walking indirect references from the document /Root catalog tree.
When a PDF is opened, the /OpenAction fires regardless of whether the target object is reachable from the catalog. Many static analysers and indexers enumerate the document via the /Root tree and never see hidden objects — yet the action still runs. This shape is associated with evasive samples that hide JavaScript or launch actions outside the normal catalog descent.
PDF JavaScript gates the payload on the Reader 7.0.x / 8.0–8.1.1 window.
A version gate of (>= 8 && < 8.11) OR (< 7.1) is the exact Reader release window patched by Adobe APSB08-13 for CVE-2007-5659 (Collab.collectEmailInfo buffer overflow). Pidief-family PDFs use this gate to fire the collectEmailInfo trigger only on vulnerable Readers and stay quiet on patched ones.
PDF JavaScript gates the payload on the exact Adobe APSB09-15 patch boundary.
A single JS body that simultaneously checks Reader version against 9.2, 8.17 (=8.1.7), and 7.14 (=7.1.4) is fingerprinting the APSB09-15 patch range, which covered CVE-2009-2990 (U3D CLODProgressiveMeshDeclaration heap overflow) and CVE-2009-3459 (FlateDecode predictor integer overflow). No benign script tests all three of those Reader version points together; this is exploit-kit dispatcher logic.
PDF uses Adobe secure-document/viewer lure wording and links to a non-Adobe host.
This catches fake 'View on Adobe', 'OnlineAdobe', or secured-PDF viewer carriers. The rule requires a clickable HTTP(S) destination outside Adobe-owned domains, so ordinary documents that merely mention Adobe do not match. Image-heavy or sparse-text PDFs using this wording are common credential-phishing carriers.
An adult or viral-video lure uses a URL shortener or smart link.
Combines explicit lure wording with an actionable redirector rather than judging either signal alone.
PDF JavaScript decodes an annotation /Subject payload with marker replacement and a callee.toString-derived key.
Agent-359xx/361xx style PDFs use syncAnnotScan()/getAnnots() only as a staging primitive: JavaScript reads an indirect annotation /Subject stream, rewrites marker bytes such as F/A/E or z to percent signs, or splits short delimiter-prefixed hex bytes such as mz/xyz. The recovered second-stage decoder then derives a small key from arguments.callee.toString() or an embedded numeric table to decode the final exploit JavaScript. The rule is emitted only after static decoding recovers exploit-like JavaScript; the exact CVE is then assigned by scanning the recovered stage for the real vulnerable API.
PDF JavaScript rebuilds hidden exploit code from annotation /Subject fields.
This family uses syncAnnotScan()/getAnnots() only as a staging primitive. The visible OpenAction reads an annotation /Subject value, splits marker-prefixed hex bytes into a second-stage decoder, and that decoder reads another annotation subject and decrypts two-character pairs with a digit key before evaling the recovered JavaScript. The rule is emitted only after static decoding recovers exploit-like Acrobat JavaScript; CVE attribution comes from the vulnerable API in the recovered stage.
PDF JavaScript shows the annotation use-after-free exploitation shape (addAnnot spray + destroy free + getAnnot re-entry + getter/leak).
Modern Adobe Reader exploits corrupt memory by spraying annotation objects with addAnnot(), freeing one with .destroy(), then re-entering through a getAnnot()/getAnnots() callback installed via Object.defineProperties (often with an annotation named 'uaf' and an Int32Array/ArrayBuffer info-leak). This is the reusable use-after-free shape behind several Reader annotation CVEs, so it is surfaced as a memory-corruption pattern rather than pinned to one CVE; the exact CVE depends on the targeted Reader build.
PDF JavaScript rebuilds an exploit stage from base-N character pairs.
Some PDF exploit kits store the real payload as a long string of two-character tokens, decode each pair with parseInt(radix), turn the bytes into JavaScript with String.fromCharCode, and eval the result. The rule is bounded to long pair tables in JavaScript streams and only fires when the recovered stage contains concrete exploit markers.
PDF links to a Microsoft-login impersonation domain.
The URI host imitates Microsoft login or Microsoft Online branding but is not a Microsoft-owned domain. This is a credential-phishing signal and does not require active PDF code to be dangerous.
CFF CharStrings contain an unusually high number of subroutine calls.
Dense callsubr/callgsubr usage stresses call-stack, bias, and bounds logic in CFF interpreters.
Type 2 CharString bytecode invokes an operator without enough operands.
Underflow forces different font interpreters to reject, pad, or continue from corrupted state, which is the kind of parser divergence used by font-engine exploits.
CFF INDEX or header declares an offSize outside the spec-allowed 1..4 range.
Implementations that accept the invalid value as a hint for offset-array stride read or write off-by-N-byte misaligned data — a shape associated with multiple Acrobat font-engine CVEs.
CFF INDEX's offset array contains entries that decrease, so successive elements appear in unexpected order.
Renderers that compute element sizes via subtraction (offset[i+1] - offset[i]) read negative or implausibly large values when offsets are non-monotonic — a known bug class in CFF parsers.
CFF INDEX offset array or data section is declared to extend beyond the available font bytes.
Renderers that follow the declared offsets read attacker-influenced bytes from adjacent memory. This is the structural shape behind several Acrobat CFF-parser CVEs.
CFF Top DICT points the Private DICT outside the embedded font stream.
The Private DICT controls subroutine and hint metadata. Out-of-range Private offsets create parser divergence and are a useful font-engine exploit primitive.
CFF2 blend bytecode grows the operand stack beyond expected bounds.
Large operand-stack growth in CFF2 CharStrings is a font-engine parser exploit surface, especially when BLEND operators are present.
CFF2 blend/stack bytecode consumes operands that are not available.
Operand-stack desynchronisation around BLEND and arithmetic operators is the key static shape from Project Zero's Adobe CoolType BLEND analysis.
Embedded CFF2 font bytecode contains repeated BLEND operators.
CFF2 blend operators drive variable-font CharString stack handling. Repeated BLEND usage in embedded PDF fonts is a strong parser-stress signal related to the Adobe CoolType BLEND bug class described by Project Zero.
PDF JavaScript rebuilds an exploit stage through character-table indexes and eval.
Older PDF exploit kits hide the real Adobe Reader exploit APIs by keeping a small alphabet string and appending hundreds of single-character substr/charAt lookups into an array before join()+eval. The finding is emitted only after the bounded static decoder reconstructs an exploit-like stage, making it a low-cost fallback when exact CVE signatures are unavailable or were hidden from the first scan pass.
PDF clickable URI hides its real host as an obfuscated IP literal or behind a brand-looking user@ userinfo.
Legitimate links never encode their host as hex/octal/dword integer octets, and never hide a real IP destination behind a brand-shaped 'name@' user-info prefix that the browser discards. Both forms exist only to make the rendered link read like a trusted site while routing to disposable IP infrastructure — a hallmark of phishing and malware redirectors.
A clickable link carries the recipient email base64/URL-encoded in a query parameter or #fragment on generated/wrapper infrastructure.
Phishing kits stamp the target's email into the landing URL so the page pre-fills and tracks the credential form per recipient. When the address is base64- or URL-encoded (in a query parameter or the #fragment, which never reaches origin-side logs) it is deliberately hidden from plain-text inspection. Unlike PDF_QR_RECIPIENT_PERSONALIZED_LINK this does not require an image-heavy lure, so it catches links delivered behind URL-security rewrites (secure-web) or open-redirect wrappers with ordinary text. The decoded token must be a valid email and the host generated/disposable or lure-keyworded, so ordinary tracking parameters do not match.
A PDF /ObjStm stream contains active-content keys such as /JavaScript or /OpenAction.
Object streams are valid PDF, but hiding executable objects inside compressed object streams is a common way to bypass simple static scanners that do not expand /ObjStm content.
PDF's embedded link hides a pirated-software title as a base64 blob in the URL (and/or carries the download| doorway marker).
TCPDF-generated SEO doorway PDFs that rank for software-piracy searches and funnel users to fake crack/keygen download pages. Unlike the plaintext link-farm lure, the pirated-software title is base64-encoded inside a single URL's path/query (never in visible text), which evades the visible-text and multi-link plaintext rules. The rule fires on the exact 'download|' doorway-template marker or on a base64 URL segment that decodes to piracy vocabulary (crack, keygen, serial key, torrent, patch), both of which a legitimate document effectively never produces. The PDF carries no parser exploit — the risk is the linked crack-download destination, so it is capped at suspicious on its own.
PDF cracked-software lure links are paired with encoded download-gateway redirectors.
This is a stronger form of the cracked-software lure family: the PDF contains several crack/keygen/serial-key links and also carries long encoded download-gateway URLs or known crack-download redirector hosts. That combination indicates an SEO lure whose purpose is to funnel users through redirect/download infrastructure commonly used for adware, unwanted software, or droppers. The PDF itself is still a link carrier, not a parser exploit.
PDF clickable URI points directly to an executable, script, shortcut, disk image, or archive.
A document that links straight to a runnable payload or archive is a delivery risk. Legitimate manuals can link to installers, so the detector is strongest when combined with invisible link annotations, repeated links, or social-engineering wording.
An image-centric open/view overlay routes to multiple unrelated destinations.
Detects the common blurred-document and central file-icon phishing presentation through structural correlation.
PDF links to a non-reputable host using a document-phishing landing path.
Some secure-document phishing PDFs rasterize the visible DocuSign/Adobe lure text or encode it through custom fonts, so in-process text extraction cannot always recover the brand wording. The detector therefore examines small linked PDFs whose clickable URL uses document-phishing landing shapes such as wp-admin/wp-admin-like staging, project/folder/rfq index.php routes, repeated slm2 paths, or heavily percent-encoded symbol slugs on non-reputable hosts.
PDF links to a serverless free-hosting subdomain named like a document-signing workflow.
Serverless platforms hand out arbitrary subdomains (workers.dev, pages.dev, web.app) that phishing kits name after document-signing workflows (document-review-sign-pending...). Three distinct workflow words are required in the host label, so ordinary project names with a single incidental word never fire.
Embedded JS stream
high
PDF_JS
PDF references a /JS stream with inline JavaScript code.
An inline JavaScript stream can contain obfuscated exploit code that triggers when the PDF is opened. It is a red flag unless the PDF is a known interactive form.
PDF stream bytes contain Windows or HTML script execution markers.
ActiveXObject/CreateObject, WScript.Shell, PowerShell, ADODB.Stream, and HTML <script> markers inside ordinary PDF streams indicate a hidden second-stage script payload rather than normal PDF JavaScript.
PDF declares /Encrypt and also contains /JavaScript, /Launch, or an OpenAction resolved to an executable action dictionary — payload is hidden from static analysis. Navigation-only OpenAction destinations are excluded.
Document encryption hides the JavaScript body and stream contents from static scanners. When executable triggers are also present, the encrypted content may conceal payload code from static inspection. droppers may use empty user passwords so the reader decrypts and runs the payload without prompting for a password.
PDF image lure hides its clickable HTTP(S) URI with PDF octal string escapes.
PDF literal strings may legally encode characters as octal escapes, but phishing carriers often encode URL punctuation this way so simple URL extractors miss the destination. Combined with an image-heavy, low-text document, this is a strong screenshot-lure signal.
PDF's clickable action targets a /app/<id>/<slug>-game-hack redirector.
Landing-page PDFs for a large SEO 'free spins / generator / game hack' lure family (coin master, robux, roblox, tiktok, etc.). The single clickable action is a redirector of the shape https://<rotating-host>/app/<numeric-id>/<slug>-game-hack that funnels victims through disposable hosts to a malware or scam payload. The host rotates, so the rule anchors on the highly specific URL path; the multi-link variants also trip ML/link-farm rules, while this catches the single-link variants that otherwise score clean.
PDF links to a document/account-themed hostname on free static hosting.
The clickable URL is hosted on a free static app platform and the hostname itself combines document/account lure terms such as drive, account, file, document, or login. This is a common credential-phishing landing-page pattern and is not normal for ordinary document references.
A free gift-code, reward, points, or generator lure links to an unrelated host.
Requires both material reward language and an actionable destination mismatch, avoiding classification from incidental gift-card discussion alone.
A government or judicial notice links to user-controlled hosting.
Official summons and court documents should not deliver their action through unrelated wildcard-hosting tenants.
PDF bytes contain a zero-size external HTML iframe.
A hidden iframe pointing to an external URL is a browser exploit-kit or redirect/dropper pattern. It is not normal PDF structure, so the detector is high-signal while remaining cheap to evaluate.
ICC tag entry points at byte ranges outside the embedded profile (or inside the tag-table region).
Colour-management stacks that follow the offset blindly read attacker-influenced bytes from adjacent memory. This shape has driven multiple ICC-parser CVEs and remains a regular finding in font/colour fuzzing campaigns.
PDF image lure with a clickable multi-word utm_term / FeedBurner-proxied SEO redirector link — the 'free ebook/manual download' phishing family.
The 'free ebook / solution-manual / document download' SEO-phishing family ships a tiny image-only (or image + filler-text) PDF whose single clickable /URI is a search-keyword gateway — a multi-word utm_term/keyword redirector (the natural-language phrase the page ranks for) or a FeedBurner-proxied feedproxy.google.com/~r/.../uplcv hop abusing a trusted Google host. The PDF carries no exploit; the payload lives on the linked destination. The broader PDF_SEO_DISPOSABLE_LINK_FARM detector requires many links and does not cover single-link variants. ClamAV and the ML model may also miss variants padded with a few text pages. Pairing the redirector with an image lure produces a HIGH finding regardless of text-page count or ClamAV/ML results. The redirector alone (no image lure) is surfaced at LOW as an IOC only.
Image-only PDF contains both remote HTTP(S) links and a local file:/// builder path.
A scanned or photo PDF may legitimately be image-only, and a normal document may contain external links. The suspicious combination here is narrower: a click-action image lure exposes a local file:/// path such as a user desktop, appdata, temp, or generator work directory while also linking to remote web infrastructure. That points to generated clickbait/phishing carriers rather than a normal document workflow.
An image-centric PDF links to a watch/video/play path outside recognized video services.
This is the structural fake-player and traffic-redirect pattern; it is host-independent and requires an actionable destination.
PDF uses invisible link annotations over image-heavy content to send users to a suspicious URI.
The finding requires several conditions: a small image-heavy PDF, invisible link annotations (border [0 0 0]), and a URI on a high-risk TLD with account/login/verify/security/support-style wording or a staged path such as /step1. That combination is stronger than a generic external link because it matches credential-phishing PDFs where the visible document is a screenshot-like prompt and the actual collection flow is hosted on the linked site.
Image-only PDF's clickable action targets a host impersonating a service/brand word with a leetspeak digit substitution (serv1ce, upd4te, …).
Screenshot-like phishing/fake-update PDFs render an image and a single clickable action whose destination host impersonates a security, service, or brand word using a leetspeak digit in place of a letter (e.g. 'serv1ce', 'l0gin', 'm1crosoft', 'payp4l'). The rule fires only when the document is image-only with little real text AND the destination is not a known-good (Tranco/allowlisted) domain, so a legitimate flyer linking to its real site is unaffected. The digit-for-letter substitution is the deception tell.
Image-only PDF's clickable action targets a host beginning with a literal 'http.'/'https.' label.
Screenshot-like phishing PDFs render a brand image plus an open/download button whose destination host starts with a literal 'http' or 'https' DNS label. The hostname imitates a URL inside a throwaway domain. The image-only presentation and disguised destination identify a credential-phishing carrier.
PDF screenshot/button lure links to a public file-hosting download endpoint.
The finding requires several conditions: the PDF is image-only or nearly image-only, contains a clickable PDF action/button, and the target URL points to a public file-hosting download endpoint such as Pixeldrain, Gofile, Filemail, file.io, transfer.sh, Catbox, MediaFire, or Workupload. That combination is much stronger than a generic URI or image-only PDF because it matches malware-delivery lures where the visible page is just a fake document/download prompt and the actual payload is retrieved from external hosting.
PDF uses invisible links to a CAPTCHA/capcha-themed web path.
CAPTCHA-themed landing pages are commonly used in phishing and ClickFix chains to move the user out of the document and into a fake verification flow. Invisible PDF link annotations make this stronger than an ordinary visible web reference.
PDF uses invisible link annotations that point to an OAuth authorization URL with a redirector chain.
OAuth authorization URLs with client_id, response_type=code, and redirect_uri parameters are legitimate in web apps, but are unusual as repeated invisible PDF link targets. When the redirect_uri leads through safelink/photo-link redirect infrastructure, the shape matches credential-phishing PDFs that hide the actual collection site behind trusted-looking redirects.
JBIG2 segment refers to one or more later segments by number.
Spec-conformant JBIG2 streams only refer backwards. Forward references are the structural shape that drove the FORCEDENTRY family of JBIG2 0-days (CVE-2021-30860 and relatives) — they confuse refcount tracking when the renderer dereferences a segment that has not been parsed yet.
JBIG2 segment refers to a segment number that has not been declared earlier in the stream.
This is the JBIG2 equivalent of a dangling pointer. Renderers that treat the missing segment as null follow a different code path than renderers that abort or read uninitialised state — a known parser-confusion primitive.
JBIG2 segment lists its own segment number in its referred-to list.
The JBIG2 spec does not define what happens when a segment refers to itself, and renderers that follow refcount paths through self-references are a textbook exploit shape (recursive resolution, double-free, use-after-free).
JBIG2 segment uses the 0xFFFFFFFF 'unknown length' form on a segment type other than generic region.
The spec restricts the unknown-length form to generic-region segments (types 36, 38, 39). Using it on other segment types lets the parser continue past the intended segment boundary and read attacker-controlled bytes from later segments.
COD marker declares more than the spec-maximum 32 wavelet decomposition levels.
Buffers and lookup tables sized from the decomposition-level count overflow on real implementations once the count exceeds 32.
PCLR (palette) sub-box declares more than the spec-maximum 1024 entries.
Palette allocators sized from this 16-bit field overflow when the declared entry count exceeds 1024 — a known-vulnerable shape across multiple JPEG2000 implementations.
JPEG2000 SIZ marker declares image dimensions, image offsets, or component counts outside plausible ranges.
SIZ overflows have triggered several past JPEG2000 parser bugs because downstream allocators multiply width × height × components × bit-depth. Zero dimensions, image offsets at or past dimensions, and absurd component counts are all known-bad shapes.
JP2 box header declares a total length less than 8 bytes (the minimum for the size+type header alone).
Spec-conformant boxes are at least 8 bytes; smaller declarations cause the box walker to either loop or read box headers from the middle of the previous box's body, a known evasion shape.
JP2 box declares a length that runs past the available stream bytes.
Different readers handle the broken box differently — some clamp to stream end and continue, some abort, some resync to the next plausible box header — leading to divergent interpretation of image geometry.
jp2c codestream box does not begin with the required Start Of Codestream (FF 4F) marker.
Renderers that tolerate the missing marker and those that abort see different content. Some implementations search forward for the next FF xx marker, which lets attacker-supplied bytes between the box header and the SOC be treated as codestream content.
jp2h header box does not begin with the mandatory ihdr (image header) sub-box.
Strict readers reject the file; lenient readers parse downstream sub-boxes anyway and infer image dimensions from defaults or from later codestream markers — leading to differing interpretations of image geometry between scanner and viewer.
Two top-level JP2 boxes claim overlapping byte ranges.
The spec requires non-overlapping box concatenation. Overlap lets a reader interpret the same bytes as two different boxes — a deliberate way to hide content from one parser while presenting it to another.
PDF contains a /JavaScript action.
JavaScript embedded in a PDF can interact with the viewer, exploit vulnerabilities, or download external content. Most legitimate PDFs do not need JavaScript. This is the most common PDF exploit vector.
PDF JS schedules a callback with a multi-kilobyte string (heap-spray primitive).
app.setTimeOut / app.setInterval with a multi-kilobyte string argument is the common PDF heap-spray primitive: it fills the renderer's heap with attacker-controlled bytes so a corrupted pointer lands in the spray.
PDF JavaScript uses a large numeric index table and indirect eval to rebuild a hidden stage.
Older PDF exploit kits sometimes keep the first recovered stage encrypted or otherwise encoded, so a static decoder cannot always validate a final CVE API. The launcher is identified by a large ar[] numeric table, a short cc character table, anti-analysis exception scaffolding such as loadXML({}), and an indirect eval sink.
PDF document JavaScript opens an obfuscated redirector URL with getURL().
The rule is constrained to document-level JavaScript that calls getURL() with a percent-escaped HTTP(S) URL and a redirector-style endpoint such as /in.cgi or /go.php. This catches redirect-carrier PDFs where the outbound URL is hidden in JavaScript instead of a normal /URI action, while avoiding broad matches on benign visible getURL links. This is malicious routing behavior, not a PDF parser CVE fingerprint.
PDF JavaScript carries a large opaque encoded stage built to be eval'd, but the encoding resisted full static decoding so no exact CVE could be attributed.
Structural fallback for the Pidief / multi-CVE exploit-kit loader family. The document has JavaScript plus a large opaque encoded stage (a z<hex> custom alphabet, or a numeric character-code array the loader sums/XORs and evals) that no exact-CVE, multi-CVE-kit or heap-spray rule could attribute because the scheme could not be fully decoded. A version-gated obfuscated JavaScript stage has no benign use; flagged suspicious on its own and pushed to malicious by an ML/AV signal or a recovered heap-spray.
Composite signal of pre-2011 Adobe Reader exploit-kit dropper shape.
Fires when the PDF JavaScript shows three or more independent signals of exploit-kit-style multi-stage obfuscation: annotation-subject payload staging (reading pr[N].subject after getAnnots), String.fromCharCode hex decoder loops, long -hh-hh-hh hex-dashed payloads, incremental construction of a method name starting from 'ev' (to hide an eval call), and three or more app.plugIns.length anti-analysis gates. The actual CVE is hidden in the final decoded layer and is not visible via static analysis, but the template is strongly consistent with exploit-kit style payload staging.
Same indirect object (N G) is defined more than once in the file, and the definitions declare different /Filter chains.
Readers that take the first definition decode different bytes than readers that take the last definition (PDF spec is ambiguous on which wins; Acrobat takes last). Divergent filter chains across the duplicates is a deliberate parser-divergence pattern: benign content is shown to scanners while malicious content is shown to the actual reader.
PDF has an /OpenAction that performs an action when the file is opened.
OpenAction specifies an action or destination to perform when the document is opened. It can execute JavaScript when paired with a JavaScript action, but OpenAction is not always code by itself.
Malformed EBSC max-range record appears alongside EBLC/EBDT bitmap tables.
EBSC is used for embedded bitmap scaling metadata. A max-range EBSC record paired with bitmap glyph tables is an Adobe libCoolType-specific parser differential related to CVE-2023-26369.
sfnt EBSC table record declares offset=0xffffffff and length=0xffffffff.
Project Zero noted the CVE-2023-26369 proof-of-concept font used this malformed EBSC table record to prevent the font from loading in many font parsing libraries while Adobe libCoolType still processed the bitmap tables.
Embedded OpenType variable font declares an implausibly large itemVariationDataCount.
Adobe Acrobat Reader has had memory-safety bugs in VariationStore itemVariationData allocation and indexing paths. Huge counts are malformed structural inputs to that parser path.
VariationStore or itemVariationData offsets point outside the containing table.
VariationStore offset arrays are pointer-like fields in OpenType variable font tables. Out-of-range entries are the structural class described in Talos' Acrobat Reader VariationStore analysis.
A cmap encoding record points outside the cmap table.
Out-of-range cmap offsets are a common structural parser bug shape.
EBLC/EBDT compound bitmap glyph metadata positions a component beyond the computed bitmap buffer.
CVE-2023-26369 exploited missing bounds checks in Adobe libCoolType's sfac_GetSbitBitmap when merging embedded bitmap glyph components. The scanner computes the bitmap buffer size from glyph metrics and flags component offsets whose merge index exceeds that buffer.
A loca entry points beyond the glyf table.
Out-of-range glyph offsets are a direct font parser memory-safety primitive.
The head table is too short to carry indexToLocFormat.
Without a valid indexToLocFormat, loca offsets can be interpreted with the wrong width.
loca glyph offsets are not monotonically increasing.
Decreasing glyph offsets imply overlapping or negative-size glyf records.
loca cannot hold numGlyphs+1 offsets.
A too-short loca table can make glyph lookup read past the embedded table.
The maxp table is too short to declare numGlyphs.
Glyph table validation depends on maxp.numGlyphs. A truncated maxp table can make readers disagree over glyph bounds.
sfnt table-record entry's offset+length lies beyond the embedded font bytes.
Renderers that follow the offset blindly read attacker-influenced bytes from adjacent memory. The OpenType table directory is the first structure parsed in any sfnt font, so this affects every font-engine code path.
PDF structural or payload evidence: PDF Affiliate Scam Review Lure.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Arithmetic Percent JavaScript Stager.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Binary Xor JavaScript Stager.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Disposable Redirector Campaign.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF fans out to many disposable random-subdomain redirector links.
The document links to many distinct random-word subdomains of one or more throwaway registrable domains, each link using a short high-entropy path code. This per-recipient fan-out is the delivery structure of mass phishing / redirector campaigns: the PDF is only a lure and each link routes to attacker-controlled credential-harvest or payload infrastructure.
PDF structural or payload evidence: PDF Embedded Child Static Triage.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Exfiltration Sink URL.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Fake Acrobat Update Lure.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF image-lure link pattern: PDF Image Lure Brand Host Link.
The PDF uses image-based lure content with outbound links that resemble credential-harvest, redirector, or brand-impersonation delivery.
PDF image-lure link pattern: PDF Image Lure Brand Path Link.
The PDF uses image-based lure content with outbound links that resemble credential-harvest, redirector, or brand-impersonation delivery.
PDF image-lure link pattern: PDF Image Lure Shortener Link.
The PDF uses image-based lure content with outbound links that resemble credential-harvest, redirector, or brand-impersonation delivery.
PDF structural or payload evidence: PDF Info Producer Char Range JavaScript Stager.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
Decoded PDF JavaScript downloads, writes, and executes a Windows payload through ActiveX.
The detector requires co-occurring ActiveXObject, XMLHTTP/WinHTTP, ADODB.Stream or ResponseBody file-write behavior, and WScript/rundll32-style execution in a recovered PDF JavaScript stage. This is a precise commodity downloader signature, not a specific Acrobat parser CVE.
PDF JavaScript behavior: PDF JavaScript Exfiltration Sink URL.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Network Beacon.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Obfuscated Unicode Heap Spray.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Page Word Heapspray Stager.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Replace Obfuscated Charcode Builder.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
Decoded PDF JavaScript reconstructs a Windows Script Host downloader.
The detector requires WScript.CreateObject/WScript.Shell together with XMLHTTP or WinHTTP download behavior, ADODB.Stream/SaveToFile style file writing, and Run/cmd execution markers in a recovered PDF JavaScript stage. This is a precise commodity downloader signature, not a specific Acrobat parser CVE.
PDF JavaScript contains Windows Script Host/JScript payload behavior.
The detector is broader than the WScript downloader signature: it requires WScript.CreateObject plus WScript.Shell and multiple payload-behavior indicators such as environment access, run/exec, sleep, registry access, XMLHTTP, ADODB.Stream, PowerShell, or cmd.exe. It surfaces embedded Windows-script payloads without assigning an Acrobat CVE when the actual vulnerability trigger is not present.
PDF JavaScript acquires, releases, delays, and then reuses a viewer-managed object.
Several Adobe Reader exploit chains abuse stale JavaScript wrappers for viewer-managed objects such as dataObjects, form fields, annotations, or media players. The detector looks for the behavioral sequence instead of one exact CVE: acquire an object, delete/remove/null it, use a timer or GC/heap pressure step, then access the same object family again.
PDF JavaScript reaches eval (or unescape/Function) through a computed member access assembled from single-character pieces.
PDF_EVAL matches the literal token eval(, so exploit kits stop writing it: they build the name at run time out of one-character strings and array elements, e.g. g[a[0]+'v'+a[1]+'l'], and the identifier never appears in the file. This rule keys on the RECONSTRUCTED name rather than on how much the code concatenates — benign minified JavaScript concatenates a great deal more, so density would separate nothing, while no legitimate code has a reason to spell a built-in this way. Rated HIGH: decisive in context alongside the JavaScript and model signals, but not a conviction on its own.
A URL was recovered from a %uXXXX shellcode run inside decoded PDF JavaScript.
Reader exploit shellcode stores its second-stage fetch URL as a run of little-endian %uXXXX Unicode escapes and downloads-and-executes it with a urlmon/URLDownloadToFile-style call. Recovering an http(s) URL from that byte stream is a concrete download/C2 indicator on its own, independent of which version-gated Acrobat CVE the surrounding script triggers. This is commodity downloader behaviour, so no specific CVE is asserted.
PDF structural or payload evidence: PDF Obfuscated Name Object.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Obfuscated Uri Scheme.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Piracy Streaming Lure.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Quoted Hex Fragment JavaScript Stager.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Random URL Link.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Shuffled Var Join JavaScript Stager.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF /URI action references a command interpreter or script host path.
Normal PDF URI actions point to web, mail, or document links. A URI using path traversal and command interpreter names such as cmd.exe is a legacy dropper/execution lure pattern and should not appear in benign documents.
PDF URL anomaly: PDF URL Mailmerge Placeholder.
The PDF contains URL text or link targets with recipient placeholders, mail-merge remnants, or other delivery artifacts uncommon in benign PDFs.
PDF URL anomaly: PDF URL Recipient Email Param.
The PDF contains URL text or link targets with recipient placeholders, mail-merge remnants, or other delivery artifacts uncommon in benign PDFs.
PDF XFA behavior: PDF XFA Title Base26 Eval Stager.
The PDF contains XFA form content associated with script execution, heap spray behavior, or staged payload recovery.
A /URI link action encodes most of its URL as PDF octal escapes, hiding the destination from URL extraction.
PDF literal strings may write any character as a \\ddd octal escape. No producer does this for ordinary URL characters — nothing emits \\055 for a hyphen — so a URI written this way is deliberately evading naive URL extraction while Acrobat resolves it normally. The rule requires at least four escapes and that they account for half the decoded URL, then reports the recovered destination. High severity when that destination is not a known-good host, medium otherwise.
PDF contains a clickable action to a document hosted on public blob/object storage.
Attackers often use public object-storage platforms as durable, trusted-looking staging locations for second-stage documents. The finding is suspicious rather than conclusive: public storage can be used legitimately, but a PDF whose clickable action points to another document on shared blob storage deserves analyst review, especially when combined with quotation, invoice, signing, or secure-document lure text.
PDF Info metadata rebuilds an exploit stage through arithmetic char-code tokens.
Some PDF exploit kits hide the real JavaScript in Info metadata fields as comma-separated arithmetic tokens such as t9.5*w or n*7.375. A small launcher reads metadata like this.producer or this.title, rebuilds the JavaScript with String.fromCharCode, and evals it. The rule fires only after a bounded decoder recovers exploit-like JavaScript from that metadata/launcher shape.
Bytes were appended after the signed/certified byte range.
An incremental update was appended AFTER a signature's ByteRange. Bare appends are normal (re-signing, form-fill), so this is only raised when the appended region introduces active content (/OpenAction, /JavaScript, /Launch, a new /Catalog, …) — the documented PDF 'shadow attack', where the viewer still shows the original signature as valid while rendering/executing content the signer never approved — or when a DocMDP no-changes certification is violated.
Two independent PDF parsers produced significantly different counts of streams or pages on the same bytes.
Exploitation samples routinely rely on parser confusion: one reader processes the file one way, a vulnerable target reads it another. When the in-process byte-level scanner and a second parser (pdfminer.six) disagree on basic structural counts, the file is almost always either corrupt or deliberately crafted to be ambiguous — both are higher-risk than a clean parse.
PDF JavaScript rebuilds and evals a hidden stage from rendered page words.
Older PDF exploit kits hide byte values in visible page text, then use getPageNumWords()/getPageNthWord() to enumerate words, take byte-like fragments, XOR-decode them, and eval the recovered JavaScript. The rule requires the page-word APIs, char-code decoding, an eval sink, and XOR logic, keeping it narrower than a generic JavaScript/OpenAction match.
A pending or confidential document prompt links to a generic hosting tenant.
Covers sparse review-document doorways while requiring an actionable cloud or website-builder destination.
PDF JavaScript mutates prototypes and references privileged PDF APIs.
Prototype pollution is a modern JavaScript exploitation technique. The detector matches __proto__, constructor.prototype, or Object.prototype mutation alongside privileged APIs such as trustedFunction, launchURL, submitForm, getField, or readFileIntoStream. It deliberately tracks the technique without assigning an unverified CVE number.
PDF link embeds a gov.xx-style host prefix inside an unrelated domain.
The URL hostname is shaped so its left side looks like a government or public-sector domain, such as example.gov.xx, while the real registered domain is something else. This tricks readers who skim the beginning of a long host and is common in government-themed phishing PDFs.
PDF links to a non-reputable government/update themed hostname.
The PDF's clickable URL uses a hostname that combines government or public-sector wording, a country code, and update/service/portal language, but it is not an official public-sector domain. That shape is typical of government-themed phishing lures.
PDF combines a QR-like image with scan/verification/business-process lure text.
QR-code phishing can hide the target URL inside image pixels so static URL rules never see a destination. The detector does not need to decode the QR payload: it requires a QR-like square image plus visible text instructing the recipient to scan or use the QR code for verification, HR, payroll, policy, email, signature, or similar business-process activity. The co-occurrence keeps normal QR codes in brochures or invoices from being flagged on image shape alone.
PDF contains a QR-like image but no extracted PDF URI and little or no machine-readable text.
QR-code phishing can hide the target URL inside image pixels so static URL rules and reputation checks never see the destination. The detector is scoped to image-only or near-image-only PDFs that contain a QR-like image but no decoded PDF URI action, which is the off-band QR delivery pattern rather than an ordinary clickable PDF link.
PDF contains quotation/RFQ/specification lure text and links to a document payload on public blob/file hosting.
Procurement-themed phishing commonly uses a simple PDF as the visible lure, then sends the victim to a quotation, RFQ, or specification document hosted on unrelated public blob/file storage. The rule requires both the procurement lure wording and a clickable document URL on public hosting so ordinary documents that merely mention quotations or specifications do not match.
PDF link launders its destination through a search-engine redirect whose unwrapped target carries phishing obfuscation.
The clickable link wraps its real destination in a google.<tld>/url?q= search redirect, borrowing Google's domain trust, while the unwrapped target hides behind a fake dotted cgi.bin path segment or runs of percent-encoded non-ASCII filler. Requiring both the wrapper and the target obfuscation keeps links merely copy-pasted from search results out of scope.
A secure file-sharing lure links to unrelated hosted infrastructure.
Correlates multilingual SharePoint, OneDrive, and secure-document wording with the actual actionable destination.
A tax-refund notice requests personal or bank confirmation through an unrelated host.
Combines tax-authority branding, a material refund, sensitive-data confirmation, and destination mismatch.
A linearized PDF declares a substantially larger file than was received.
The declared linearized length exceeds the available bytes by a material amount. Objects and exploit evidence may therefore be missing, so the scan must not be presented as a complete clean analysis.
A branded SharePoint, Google, Adobe, or government document lure links outside that service.
Correlates rendered trusted-service branding with the actual action host rather than treating branding or a URL independently.
Decrypted Type 1 CharString contains repeated get/callOtherSubr bytecode sequences.
Adobe Type 1 CharStrings are stack-machine bytecode. Repeated get/callOtherSubr sequences are unusual in normal glyph programs and match the primitive used by CVE-2021-21086-style CoolType operand-stack manipulation.
Decrypted Type 1 CharString bytecode pushes more operands than expected.
Type 1 CharStrings are stack bytecode. Operand-stack overflow is a font-engine exploit primitive.
Decrypted Type 1 CharString bytecode consumes operands that are unavailable.
Stack underflow in Type 1 bytecode can lead to interpreter state corruption or parser divergence.
U3D block declares a data or metadata section size beyond any plausible legitimate value.
Allocators sized from these 32-bit fields are a recurring exploit primitive in 3D engines. Real-world U3D blocks rarely exceed a few megabytes; tens of megabytes is consistent with adversarial construction.
U3D block declares a total size that runs past the available stream bytes.
Renderers that resync to the next plausible block header read attacker-controlled bytes from the gap between the truncated block and the next header. Real-world U3D files produced by 3D tooling are byte-aligned and never declare a size larger than the file.
PDF embeds an XFA dataset with a <script> or <xfa:script> block.
XFA scripting has been the exploit primitive for several Adobe Reader RCEs (CVE-2010-0188 family, CVE-2018-4901). Plain XFA without scripts is far less risky.
PDF XFA script rebuilds hidden JavaScript from numeric field data or a character table.
Some XFA exploit kits store the real JavaScript as numeric values in form fields or as indexes into a short character table, then rebuild and eval it during an initialize event. The rule is bounded to XFA script packets and only fires after static decoding recovers exploit-like JavaScript or shellcode markers.
XFA initialize script maps numeric rawValue data through a character table and evals it.
This is a bounded fallback for XFA exploit-kit launchers whose final recovered stage remains encoded. It requires an XFA script, rawValue numeric staging, a short cc character table, a long reconstruction loop, and an eval-like sink.
PDF JavaScript launches a URL with a file://, cmd:, or UNC scheme.
Foxit and Adobe handle these schemes inconsistently — they have been used for code execution and NTLM credential theft (the latter via UNC paths).
JavaScript eval() function found in PDF.
eval() executes a string as code. In malicious PDFs it is often used for dynamically constructed or decoded exploit code, making static analysis harder.
PDF JavaScript pairs getAnnots with heap-spray shellcode and an embedded payload.
The document calls getAnnots() in a context containing classic Adobe Reader heap-spray markers and an embedded payload. This is CVE-2009-1492-related evidence, but is not exact CVE attribution unless the getAnnots argument has the distinctive overflow/long-string trigger shape.
JavaScript unescape() function found in PDF.
unescape() decodes percent-encoded strings. In PDF exploits, it is commonly used to convert encoded shellcode back to raw bytes before triggering a vulnerability.
PDF cross-reference table claims object N is at byte offset O, but the bytes at O do not begin with the expected 'N G obj' header.
Readers that trust the xref will resolve the indirect reference to one set of bytes; readers that scan the file linearly will resolve it to another. This parser-divergence shape is a recurring evasion technique in targeted PDF exploits.
ASCII85Decode filter (with exploit indicators)
medium
PDF_FILTER_85
PDF uses ASCII85Decode stream filter alongside active scripting content.
ASCII85 is a relatively uncommon encoding. Like ASCIIHexDecode, it has legitimate uses, so we only flag it when it co-occurs with active scripting content (/JavaScript, /JS, /XFA, or /RichMedia).
PDF uses ASCIIHexDecode stream filter alongside active scripting content.
ASCIIHexDecode is legitimately used by some scanned-document and PostScript-derived PDFs, so on its own it's noise. The detector only fires when the filter co-occurs with active scripting content (/JavaScript, /JS, /XFA, or /RichMedia) — the shape associated with payload obfuscation.
Small PDF routes a clickable link through an ad/tracking redirector.
Tiny PDFs that contain little content beyond a redirector URL are common in malvertising and phishing delivery. The embedded destination can change or be selectively served, so this is stronger than a generic external URI.
Additional Actions dictionary
medium
PDF_AA
PDF defines /AA (Additional Actions) triggers.
Additional Actions can fire on events like page open, print, or close. They are often used to trigger script or external actions during viewing.
A single CFF Type 2 glyph program is far larger than expected.
Normal glyph programs are small. Very large CharStrings often indicate bytecode-as-payload, malformed subroutine graphs, or exploit grooming.
CFF INDEX (Name / Top DICT / String / Subrs / CharStrings) declares thousands of entries.
Real fonts have at most hundreds of entries in any single INDEX. Allocators sized from this 16-bit field have been a recurring exploit primitive in font rasterisers.
CFF INDEX's first offset entry is not 1 (the spec-mandated value).
Some implementations validate; others trust the value and read from the wrong byte. Real-world fonts produced by standard tooling always have first offset = 1.
PDF links advertise cracked/pirated software (crack, keygen, serial key, warez).
These PDFs are SEO-spam carriers: they pack many clickable links whose targets use software-piracy vocabulary so the document ranks for '<app> crack download' searches, then routes users to fake crack pages serving potentially-unwanted programs, adware, or droppers. The rule fires on several distinct links carrying piracy-specific tokens in the URL itself, so ordinary documents that merely mention the word are not affected. The PDF carries no exploit of its own — the risk is the linked destinations, so it is capped at suspicious.
Thin PDF whose rendered text is a credential / secure-document / identity-verification lure and whose only clickable action links to a non-reputable host.
The text-layer variant of the malspam carrier. The image-only lure rule requires an image-heavy, near-textless page (n_text < 3), so it misses Google-Docs-rendered phishing PDFs that carry a CID/ToUnicode text layer — SSA/IRS 'identity verification', 'secured Adobe PDF document' gates, French 'fichier sécurisé — voir le document'. The detector inspects the rendered text for a strong credential/secure-document lure phrase and fires when the page is thin and its sole external link (1–2 distinct) is not known-good. Suspicious rather than malicious: the lure text plus a lone non-reputable link is the corroboration; ML/AV signals push it higher.
PDF hides a clickable URL-shortener destination with PDF string escapes.
PDF literal strings can legally encode punctuation with octal escapes, but pairing that obfuscation with a URL shortener is a stronger phishing signal than a normal visible link. Attackers use this to defeat simple URL extractors while hiding the final landing page behind a redirector.
A technical-manual download lure links to a query-driven PHP document gateway.
Kept contextual because the local PDF does not prove the remote payload; the compound signal is sufficient for SUSPICIOUS.
PDF advertises a free Robux/V-Bucks generator and links to a scam doorway or Looker Studio redirector.
Free game-currency "generators" are survey and credential scams aimed at younger players. The rule requires both the visible generator lure text and a matching doorway link (or a Looker Studio report used as a redirector), so game journalism or safety guides without scam links do not fire.
PDF contains 500+ stream objects.
An abnormally high stream count may indicate heap spraying (filling memory with repeated data) or heavy obfuscation of the PDF structure. Threshold is 500 to avoid flagging legitimate technical / textbook PDFs.
Same ICC tag signature appears more than once in the tag table.
Per spec each signature must be unique. Implementations that take the first vs. the last copy produce different colour transforms — a shape used to hide an attacker-chosen mAB./mBA. pipeline behind a benign-looking earlier entry.
ICC profile declares more than ~256 tag entries; real-world profiles have at most a few dozen.
Implausibly large tag counts are consistent with hand-crafted profiles designed to exhaust allocator state or trigger integer overflows in the tag-table indexing arithmetic.
ICC profile header field 'profile size' does not match the actual length of the embedded profile bytes (or the tag table extends past the bytes available).
Colour-management stacks that trust the header field and those that trust the container length read different bytes. The CVE-2018-4990 family of ICC-parser bugs lived in exactly this disagreement.
ICC tag declares zero data length but a non-zero offset.
Implementations that prefetch the offset before checking size read out-of-bounds bytes. Real-world profiles either use zero/zero or non-zero/non-zero — the mismatched form is consistent with adversarial construction.
A raster-only PDF overlays an actionable link to a non-official external host.
The structural pairing is a common way to hide phishing language from text extraction while preserving a clickable action.
Image-heavy PDF whose sole clickable action links to a non-reputable host carrying a random throwaway subdomain.
The canonical malspam-carrier shape: a screenshot-like 'click to view document' page whose only purpose is to funnel the victim to one redirect/landing URL on a compromised or throwaway domain. Flagged suspicious rather than malicious because the image lure plus a single non-reputable link with a random subdomain is the only corroborator; ML/AV signals push it to malicious.
JBIG2 stream declares thousands of segments where real-world scanned-document JBIG2 typically contains tens to a few hundred.
Hand-crafted JBIG2 streams designed to stress the segment-graph allocator or refcounter are a recurring exploit primitive. On its own this is a weak signal but it contributes when paired with other JBIG2 anomaly rules.
PDF uses JBIG2Decode image compression.
JBIG2 is a complex image codec. Vulnerabilities in JBIG2 decoders have been exploited in high-profile zero-click attacks (e.g. NSO Group's FORCEDENTRY, CVE-2021-30860).
A loan or instant-approval solicitation conceals its destination behind a URL shortener.
The combination is characteristic of financial lead fraud and credential collection while avoiding a verdict based on either loan wording or a shortener alone.
sfnt offset table declares more than ~64 tables, well beyond any realistic font.
Allocators sized from the numTables field are an exploit primitive. Real OpenType / TrueType fonts contain on the order of 10–25 tables.
cmap declares an implausibly large number of subtables.
Very large subtable counts stress parser loops and allocations.
cmap header or encoding records extend past the table.
Malformed character-map tables can make different text/glyph paths disagree.
sfnt directory contains the same 4-byte table tag more than once.
Renderers that take the first record vs. the last record produce different glyph rasterisation. Duplicated table tags are not produced by any standard font tooling.
maxp.numGlyphs is far beyond typical embedded PDF fonts.
Huge glyph counts stress loca/glyf allocation and iteration paths.
A name record points outside name table string storage.
Out-of-range name strings are a low-level font table consistency violation.
The name table record count is implausibly large.
Huge name record counts stress table-walking logic.
name records or string storage point outside the name table.
Malformed name tables are useful parser-divergence evidence when paired with other font anomalies.
PDF structural or payload evidence: PDF Action Parser Evasion.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF JavaScript matches a multi-CVE Adobe Reader exploit-kit pattern.
The PDF contains JavaScript structures used by older Adobe Reader exploit kits that dispatch across multiple vulnerabilities or Reader versions. The finding indicates an exploit-kit family shape, not a single confirmed CVE.
PDF structural or payload evidence: PDF Aitm Tokenized Phish Link.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Auto Open Redirect.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF link farm points into compromised CMS upload paths.
The PDF contains many outbound links to upload directories or media paths on likely compromised CMS sites, a common SEO-spam and traffic-redirection pattern.
PDF structural or payload evidence: PDF Embedded FileSpec Content Mismatch.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Flate Image Nop Sled.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Game Hack Link Farm.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Generic Stage Recovery.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF JavaScript behavior: PDF JavaScript Extreme String Rewrite Obfuscation.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Known CVE Heapspray Family.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Remote Doc Fetch.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Stream Truncated.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF JavaScript behavior: PDF JavaScript Template Placeholder.
The PDF contains JavaScript evidence for obfuscation, network activity, payload staging, form submission, or exploit-style heap manipulation.
PDF structural or payload evidence: PDF Myhome Coded Book Link Farm.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF contains a dense disposable-domain SEO link-farm pattern.
The PDF contains many outbound link annotations or URI actions whose destinations match disposable, SEO-spam, or low-reputation infrastructure. This indicates a document being used as a search-index or link-farm carrier.
PDF structural or payload evidence: PDF SEO Spam Template.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Script Encoder Blob.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
PDF structural or payload evidence: PDF Type1 Mm Font Overflow.
The PDF contains suspicious structure, embedded content, malformed parser state, launch behavior, staged payload data, or exploit-like document features.
A PDF signature's CMS failed verification.
Either the signer's signature over the signed attributes is invalid, or the signed content digest does not match the bytes the ByteRange covers. The signature was tampered with, forged, or the signed content was altered after signing.
A declared PDF /EmbeddedFile stream could not be decoded through its filter chain.
The detector only applies to standard attachment streams referenced by /EmbeddedFile or /EF. When their filter chain fails, the raw stream is carved so unsupported or malformed attachment encodings do not hide payload bytes from artifact triage.
An /EmbeddedFile attachment is named as a shell, PowerShell, batch, or scripting-host script.
Benign PDF attachments are documents, spreadsheets or images. A script attachment has no magic bytes for the content classifier to key off, so it previously surfaced only as a generic 'Embedded file' finding. The rule reads the /F and /UF filespec names and escalates to high severity when the document also contains a literal IPv4:port URL — a script payload alongside a hardcoded staging endpoint. Security-range and CTF artifacts do legitimately bundle scripts, which is why the bare case stays medium.
PDF has at least one image XObject and zero text-emitting operators in raw or decompressed content streams.
Phishing PDFs are often built by exporting a screenshot to PDF: a single page with one or more image XObjects and no text. The carrier evades text-based scanners (no keywords to match) and delivers its call-to-action purely through rendered pixels — a phone number to call, a QR code to scan, or a link the user is told to type. Distinct from PDF_IMAGE_LURE, which requires a small file and an in-PDF click-action; the detector has neither constraint and looks inside compressed content streams to avoid false positives on real text-bearing PDFs.
A signature's ByteRange starts past byte 0, leaving content uncovered.
A legitimate PDF signature covers from byte 0. A ByteRange that starts past the file head leaves real content outside the signed region while still presenting as 'signed' — the Universal Signature Forgery evasion.
PDF clickable URI points to a literal IPv4 address.
Legitimate PDFs normally link to named domains. Clickable HTTP(S) links to raw IP addresses are common in disposable phishing and malware-delivery infrastructure, especially when paired with link annotations or screenshot lures.
A /JS action refers to an object absent from the file.
The script payload is incomplete or truncated; the remaining launcher cannot safely establish a CVE attribution.
PDF references a remote or embedded document via GoToR/GoToE.
GoToR/GoToE can open another PDF or trigger loading of a remote resource, potentially bypassing security controls by chaining documents.
PDF carries /pdf/<domain> + /doc/<domain> SEO doc-farm redirector links.
The generated 'free document/template' SEO phishing family links through redirectors whose path ends in a bare website domain behind a /pdf/ or /doc/ segment (e.g. 'host/Document-Title-Slug/pdf/target-site.tld'). Firing requires the family's signature /pdf/ + /doc/ variant pair on the same host and slug, or one such redirector alongside multiple links into WordPress form-plugin upload storage. The PDF is an inert link carrier; the risk lives in the linked destinations.
PDF clickable link host starts with a literal 'http.'/'https.' DNS label.
A destination hostname whose first DNS label is literally 'http' or 'https' (e.g. 'https.file-transfers.example.com') makes the rendered link read 'https://https.…', disguising the real registered domain as a secure service. No legitimate operator names a host this way; it is a URL-deception tell used by phishing carriers.
A nearly textless open/view button leads to a user-controlled cloud share.
Kept contextual because legitimate cloud shares exist; branding, urgency, or personalization can corroborate it separately.
PDF stream object declares a /Length that does not match the actual bytes between 'stream' and 'endstream'.
Different PDF readers resolve stream length either from the declared /Length value or from the 'endstream' framing markers. When the two disagree, the same file renders as different content in different readers — a known evasion shape used to hide payload from static scanners that trust one source while the actual reader trusts the other.
PDF stream declares /Filter /FlateDecode but the raw stream bytes are rejected by zlib in both wrapped and raw modes.
A renderer that aborts on the broken stream and one that fails-open see different document content. Targeted samples sometimes deliberately break the filter chain so that lighter-weight scanners skip the stream while heavier renderers still extract a payload from the partial data.
String.fromCharCode found in PDF JavaScript.
fromCharCode constructs strings from numeric character codes. Exploit authors use it to build payloads character by character to evade string-based detection.
A dense /JS reconstruction stage is cut off before its balanced closing delimiter.
This records incomplete scanner visibility rather than assigning a CVE. A partial exploit fragment may omit the vulnerable API call, so attribution requires a complete recovered sink and trigger argument.
U3D stream contains thousands of blocks where real-world files typically contain at most a few hundred.
Hand-crafted U3D streams designed to stress the modifier-chain allocator or refcounter are a recurring exploit primitive on the U3D parser surface. Weak signal alone, contributes when paired with other 3D-content anomaly rules.
PDF clickable URI points to a URL shortener.
Clickable URL-shortener links hide the final landing page from static review and are common in phishing redirect PDFs. This is stronger than a generic external URI because the visible destination is an intermediate redirect service rather than the actual site.
PDF carries many document links parked on website-builder CDNs or simple download gateways.
Generated SEO-spam PDF carriers often point to many PDFs hosted on free website-builder CDNs or throwaway download gateways, with visible ebook/manual/download lure text. The rule requires multiple such links plus lure text, and is capped at suspicious because the PDF is usually an inert redirect/link carrier rather than an exploit document.
PDF embeds a file attachment.
Embedded files can carry executables, scripts, or other malware. While some legitimate PDFs include attachments, this warrants inspection.
PDF contains many images but very few text blocks — possible screenshot lure.
A common phishing technique renders a screenshot of a legitimate document (e.g. a locked Word file, a DocuSign request) as a full-page image with no real text content, then overlays a form button or URI action on the image. Caveat: this heuristic has a high false-positive rate. Scanned documents (contracts, invoices, IDs), image-heavy brochures, and photo PDFs all trigger it legitimately. Use this finding only as supporting context alongside higher-severity indicators.
PDF body contains an indirect reference (N G R) to an object number that is never defined in the file.
Lenient readers silently skip dangling references; strict readers may treat the slot as null and follow a different code path. On its own this is often just a corruption artefact — older scanner output and damaged PDF/A files commonly trip it — but it contributes weakly when paired with stronger anomaly signals.
PDF uses Optional Content Groups (OCG) and contains an action trigger.
Optional Content Groups allow parts of a PDF to be shown or hidden. Attackers abuse this to show lure content on first open then hide it (defeating sandbox screenshots) while the action trigger still fires. OCGs alone are standard in CAD/technical, multilingual, and layered PDFs, so the detector only fires when an action trigger is also present.
PDF is encrypted with a non-empty user password — it cannot be opened, decrypted, or statically inspected without the password.
Unlike a permission/DRM-sealed PDF that opens with an empty user password (billing statements, signed invoices — the reader decrypts transparently and the analyzer can inspect the content via qpdf), this document requires a real user password to open, so every string and stream is cryptographically inaccessible to static analysis. This is a recognised malware-delivery evasion: the open-password is supplied in the phishing e-mail body so the recipient can open the file while automated AV/sandbox pipelines cannot. It is not malicious on its own (confidential documents are also password-protected), but it means the content was not inspected and should be treated as unknown, not clean.
PDF contains U3D/3D annotation content or U3D signatures.
U3D is a complex legacy 3D parser surface, but valid U3D models are legitimate content. This generic finding carries no CVE attribution; specific CVE rules require independently validated malformed U3D blocks.
PDF uses XML Forms Architecture (XFA).
XFA forms can contain JavaScript and complex logic. Vulnerabilities in XFA parsers have been exploited in the past.
PDF JavaScript calls syncAnnotScan() — an exploit-kit staging primitive used to force annotation enumeration before reading payload bytes from /Subject fields.
syncAnnotScan() is a legitimate no-argument Acrobat / Foxit JavaScript API that ensures all annotation objects are populated before getAnnots() is called. It is not a vulnerable sink and has no associated CVE. However, exploit-kit JavaScript routinely calls it as a staging step in the pattern 'z.syncAnnotScan(); var p = y.getAnnots({nPage:0}); var s = p[0].subject; ... eval(s)' — where the encoded payload was hidden in annotation /Subject fields. A bare call rarely appears in legitimate PDFs, so it is a low-severity exploit-kit-shape indicator on its own; combined with getAnnots() + subject reads + eval, the related rule PDF_JS_OBFUSCATED_DROPPER fires the high-severity composite finding.
Same indirect object (N G) is defined more than once with different body bytes.
Body-only duplicate objects are common in benign incremental updates and PDF editor save chains. The analyzer records the structure for explainability, but it is not treated as an unknown-exploit signal unless a duplicate body carries active content or divergent filters.
Type 2 CharString bytecode pushes more operands than the interpreter stack should hold.
CFF/Type 2 CharStrings are stack bytecode. Operand-stack overflow is a recurring font parser bug class and a strong structural exploit signal.
Semantically equivalent JavaScript views were deduplicated before counting and analysis.
Encrypted, normalized, referenced, and carved views can expose the same script multiple times. Collapsing them by semantic hash prevents provenance amplification from inflating exploit feature counts while retaining the authoritative first copy.
The standard EICAR test string is exported and launched by Acrobat JavaScript.
This known antivirus demonstration exercises a dangerous PDF delivery feature but is not a real payload or parser CVE.
PDF declares /Encrypt — strings and stream contents are encrypted.
PDF document encryption applies the standard security handler's cipher (RC4 or AES) to all strings and stream contents. The keys (/JavaScript, /Filter, etc.) remain visible but their values do not. Many legitimate documents are encrypted (signed contracts, billing statements, rights-managed material); on its own this is informational, but it limits what the static scanner can see.
PDF contains an external URL action.
The PDF links to an external website. While common in legitimate PDFs, malicious PDFs use URLs to redirect to phishing sites or malware downloads.
Large PDF contains many JBIG2 page images without executable actions.
This profile bounds expensive late analysis for ordinary scanned documents while retaining earlier structural findings.
Same indirect object (N G) is defined more than once with different body bytes.
Duplicate object bodies create first-wins versus last-wins parser divergence even when the /Filter chains look identical.
The document is digitally signed or certified.
A PDF can be signed with a detached PKCS#7/CMS signature whose ByteRange covers the whole file except the signature hole. The signer certificate, issuer, certification level (DocMDP) and the signature's cryptographic validity are shown for context. Unlike a VBA-project signature, PDF JavaScript is never signed on its own — only as part of the signed byte range — so presence of a signature is NOT a benign indicator and does not affect the risk score.
The cross-check parser (pdfminer.six) raised an error on this file.
The analyzer cross-checks its in-process byte-level PDF scan against an independent pdfminer.six pass to surface parser-divergence exploit shapes. A pdfminer error here is itself a signal — malformed PDFs (corrupted xref, divergent duplicate objects, broken object streams) often deliberately defeat one parser while remaining renderable in another, which is the basis of several real-world PDF exploitation primitives. The static byte-level heuristics still ran on the file and their findings above are valid; only the differential cross-check signal is missing.
The PDF signing certificate is self-signed (issuer == subject).
The document is signed with a self-signed certificate that no certificate authority vouches for. Unlike self-signed VBA macro signing (a real attacker trick), self-signed PDF sealing is a mainstream-legitimate pattern — invoicing and document services seal PDFs with self-signed certs for integrity, not CA-backed identity. So this is informational context (surfaced as the signature box's 'Self-signed' status) and does not affect the risk score; tampering surfaces as PDF_SIGNATURE_INVALID instead.
Document JavaScript matches a narrow barcode or attachment UI helper profile.
This profile requires multiple library-specific operations and rejects spray, eval, shellcode, payload, and vulnerable-argument evidence. It prevents ordinary interactive forms from entering unknown-exploit triage.
Source objects, stage index, and semantic hash are retained for reconstructed JavaScript.
Provenance makes cross-object reconstruction reproducible and prevents normalized copies from being counted as independent stages.