Skip to content

A CV that lists web skills is no longer refused as a dangerous PDF - #2195

Merged
wintermeyer merged 2 commits into
mainfrom
claude/pdf-gate-structure-2136
Sep 11, 2026
Merged

A CV that lists web skills is no longer refused as a dangerous PDF#2195
wintermeyer merged 2 commits into
mainfrom
claude/pdf-gate-structure-2136

Conversation

@wintermeyer

@wintermeyer wintermeyer commented Sep 11, 2026

Copy link
Copy Markdown
Owner

A CV whose page reads "HTML/CSS/JavaScript" was refused as a dangerous PDF: the
byte scan could not tell a name from a word.

Vutuv.Uploads.PdfGate now blanks strings, hex strings and comments before it
looks for a name. A range spanning a << or >> is never blanked: inside an
object stream a reader picks objects out at recorded offsets, so a ( in one
and a ) in the next could otherwise hide a catalog. It carries a work
allowance, because a file can make it re-read itself.

Which names are looked for did not change, and a first version that dropped
/JavaScript is why: measured, pdfinfo without a page range reads page 1
only, never follows an /OpenAction's /Next chain, and reports different
things on different builds. It now gets -f 1 -l 999999, and an answer missing
the fields we read counts as no answer.

Attacks, corpus counts and the invariant: in the issue.

Closes #2136

https://claude.ai/code/session_013VnEsuePUe2CB2QvDcshcp

Das PDF-Tor suchte die Namen /JavaScript, /OpenAction und /EmbeddedFile im
ganzen Dokument, also auch im Seitentext, und wies deshalb einen Lebenslauf
mit "HTML/CSS/JavaScript" als Programm ab, während pdfinfo JavaScript: no
sagte. Die beiden Fragen, die poppler aus der geparsten Struktur beantwortet,
stellt der Byte-Scan jetzt gar nicht mehr: gemessen erkennt pdfinfo ein Skript
an jeder Aktionsstelle und pdfdetach jede angehängte Datei. Die vier übrigen
Namen liest er aus der PDF-Syntax statt aus dem Text, Zeichenketten,
Hex-Zeichenketten und Kommentare werden vorher geleert. Geleert wird aber kein
Bereich, der ein << oder >> enthält, denn in einem Objekt-Stream liest ein
Leser jedes Objekt an der Stelle, die dessen eigene Tabelle nennt, und eine
Klammer im einen Objekt könnte sonst den Katalog im nächsten verstecken.

Diesen Text hat ein KI-Agent in meinem Namen geschrieben. Ich weiß, dass das
problematisch ist.

Claude-Session: https://claude.ai/code/session_013VnEsuePUe2CB2QvDcshcp
Ein blinder Prüfer fand fünf Konstrukte, die das Tor annahm und speicherte: ein
Öffnungsskript auf Seite 2, 3 und 20, und eine JavaScript-Aktion, die hinter
/Next an einem Ziel hängt, als Dictionary wie als Array. Gemessen liest pdfinfo
ohne Seitenbereich nur Seite 1, folgt keiner /Next-Kette und meldet je nach
Version Verschiedenes; also bekommt der Aufruf -f 1 -l 999999, /JavaScript
steht wieder neben ihm im Byte-Scan, und eine Ausgabe ohne die Felder, die wir
lesen, gilt als keine Antwort statt als Unbedenklichkeitsbescheinigung. Dazu
zwei Fehler dieser Änderung selbst: ein einzelnes < als letztes Byte ließ den
Ausblende-Durchgang auf derselben Stelle kreisen, und statt einer Abkürzung,
die weniger ausblendet und dabei genau den Lebenslauf wieder abwies, trägt der
Durchgang jetzt eine Obergrenze in gelesenen Bytes.

Diesen Text hat ein KI-Agent in meinem Namen geschrieben. Ich weiß, dass das
problematisch ist.

Claude-Session: https://claude.ai/code/session_013VnEsuePUe2CB2QvDcshcp
@wintermeyer
wintermeyer force-pushed the claude/pdf-gate-structure-2136 branch from 8446574 to 37f805c Compare September 11, 2026 16:45
@wintermeyer
wintermeyer merged commit 3b41b3e into main Sep 11, 2026
1 check passed
@wintermeyer
wintermeyer deleted the claude/pdf-gate-structure-2136 branch September 11, 2026 17:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A CV that mentions JavaScript is refused as a dangerous PDF

1 participant