eliziff hardens court search and PDF handling

A small security pass closes two routes by which trusted legal-research workflows could be turned against their users.

securityintegration

eliziff has tightened how the fork follows CourtListener search results, preventing a manipulated next-page link from sending an authentication token to an untrusted destination.

  • Court search pagination now stays within approved CourtListener origins, protecting credentials while users move through results.
  • PDF viewing no longer permits a riskier form of in-browser code compilation when opening untrusted documents.

Neither change alters the research experience on its face. It makes the surrounding plumbing less willing to trust links and files simply because they arrived in a familiar workflow.

So what Firms and legal-product teams handling authenticated case research or externally supplied PDFs should care because these are quiet safeguards around routine, high-trust tasks.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

4 commits from eliziff/Beaver, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
eaaa596f fix: bind remote connector credentials Eli Ziff 2026-07-27 ↗ GitHub
a4f60720 chore: patch vulnerable transitive dependencies Eli Ziff 2026-07-27 ↗ GitHub
4135d954 sec: patch dependency tree, drop dotenv, block install scripts Eli Ziff 2026-07-27 ↗ GitHub
commit body
npm audit 10 -> 1: hono/qs/body-parser/@hono-node-server/fast-xml-parser
fixed in-semver (MCP SDK 1.29->1.30), @anthropic-ai/sdk bumped
0.90->0.115 (advisory GHSA-p7fg-763f-g4gf), multer bumped to 2.2.0 off
the 1.x LTS line. The residual is esbuild's dev-server advisory, pinned
by tsx/vite ranges and unreachable here (no esbuild serve).

dotenv is gone: Node >=22.13 ships process.loadEnvFile with identical
no-override semantics (verified: shell wins, ENOENT guarded), loaded
via a side-effect module so ESM import hoisting cannot run routers
before env exists.

.npmrc sets ignore-scripts=true: zero packages in this tree declare
install scripts (verified via npm query), so install-time code
execution - the main compromised-package vector - is now refused
outright. Verified with a full clean npm ci + tsc + 709-test suite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsMXzBsEJ27DjJVPSfW5o
310a2f35 sec: clamp CourtListener egress, disable pdf.js eval, drop orphan page counter Eli Ziff 2026-07-27 ↗ GitHub
commit body
courtlistenerFetch follows absolute URLs from API payloads (pagination
next links) with the Authorization token attached; it now refuses any
origin other than courtlistener.com/storage.courtlistener.com so a
poisoned link cannot exfiltrate the token. All four pdf.js getDocument
sites set isEvalSupported: false - untrusted uploads never reach the
eval-based font compiler (defense in depth over the CVE-2024-4367
class). projects.ts drops the countPdfPages copy orphaned by the
upload-handler dedup.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsMXzBsEJ27DjJVPSfW5o

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-826.md from inside the repo you want the changes in.

⬇ Download capture-thread-826.md