• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ukeeper / ukeeper-readability / 28705617872
78%
master: 78%

Build:
Build:
LAST BUILD BRANCH: fix/docker-gha-cache
DEFAULT BRANCH: master
Ran 04 Jul 2026 12:04PM UTC
Jobs 1
Files 10
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

04 Jul 2026 12:03PM UTC coverage: 77.85% (-0.1%) from 77.947%
28705617872

Pull #83

github

paskal
Block SSRF to non-public addresses via connect-time IP guard

POST /api/extract is unauthenticated and the extractor fetched any URL it
was given with no host validation, so a caller could reach
http://169.254.169.254/... (cloud metadata), localhost and other internal
hosts; image extraction amplified it by following <img src> into more
internal fetches.

The page retriever and image fetcher reject targets that resolve to
loopback, private, link-local, unspecified, multicast and other IANA
special-purpose ranges (0.0.0.0/8, CGNAT, benchmarking, documentation,
reserved, broadcast) via a net.Dialer Control hook that checks the actual
IP at connect time, so it also covers redirect-to-internal and DNS
rebinding; the guarded transport disables env proxies so validation can't
be bypassed through a proxy. extractWithRules additionally validates the
resolved host up front, so the Cloudflare path (which fetches remotely and
isn't covered by the dialer) enforces the same policy.

Image probes share a single lazily-built client (and its guarded transport)
rather than constructing one per <img>, so enabling the guard by default
doesn't churn transports/FDs; the probe request no longer forces
Connection: close, letting the shared client reuse connections.

Enabled by default; operators opt out with --allow-private-networks for
trusted intranet extraction. The default HTTPRetriever inherits the flag
from UReadability so package-level callers are guarded too.
Pull Request #83: Block SSRF to non-public addresses via connect-time IP guard

81 of 101 new or added lines in 5 files covered. (80.2%)

833 of 1070 relevant lines covered (77.85%)

9.26 hits per line

Uncovered Changes

Lines Coverage ∆ File
14
78.79
extractor/safedial.go
4
86.86
-2.29% extractor/readability.go
2
69.57
-1.2% main.go
Jobs
ID Job ID Ran Files Coverage
1 28705617872.1 04 Jul 2026 12:04PM UTC 10
77.85
GitHub Action Run
Source Files on build 28705617872
  • Tree
  • List 10
  • Changed 4
  • Source Changed 0
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Pull Request #83
  • PR Base - master (#28463114096)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc