docs: scan #102 — langroid/langroid (132 findings, 0 real, 33rd clean scan) - #142
Merged
Conversation
… scan) Strict-norm target (substantial SECURITY.md, PVR enabled, 16 published advisories). The policy enumerates seven in-scope categories, so the scan checked them one at a time rather than hunting denylist bypasses the policy already declares out of scope. Seven for seven — nothing filed. Two methodology notes worth the archive: - A single-idiom taint sweep OVER-reports on default-deny code. Three prior advisories share one mechanism (relabel USER content as sender=Entity.LLM) and each blames a handler lacking a chat_doc parameter. Sweeping on that flags 16 of 24 handlers, including SendTool/AgentSendTool, which are fine: there are three correct taint idioms (doc-derived, per-tool self._tainted, and implicit propagation via the tool_messages list). Enumerate the idioms before counting violations. - Cleanest two-install-path split in the series: pip-audit read the pyproject floors and saw nltk 3.10.3 (1 advisory); Trivy read uv.lock and saw nltk 3.10.0 (17). Both right. The lock governs CI/contributors only — the Docker image and PyPI consumers resolve from floors — so the 83 lockfile advisories touch no shipped artifact. Published rather than filed: uv.lock pins gitpython 3.1.56 against CVE-2026-78676 (critical, fixed 3.1.59) in a package langroid itself imports, and there is no dependabot.yml watching the lock. Also fixes a pre-existing dead link in scan-log.md (scans/openai-codex.html -> scans/soju06-codex-lb.html), unrelated to this scan. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scan #102 of the public series. langroid/langroid — 4.1k★ multi-agent LLM programming framework, MIT, 459 Python files, HEAD
053dbfe.132 findings, zero real after curation. Thirty-third clean scan. Nothing filed upstream.
Strict-norm target: substantial
SECURITY.md, private vulnerability reporting enabled, 16 published advisories. The policy is unusually good — it names its ownsanitize_command()and SQL/Cypher denylists as best-effort hardening, not security boundaries, points at the real ones (database role, container, egress), and then enumerates seven in-scope categories. So the scan checked those seven rather than hunting the denylist bypasses the policy already declares out of scope. Seven for seven.The advertised-boundary test is only worth running because it can come back no — this series has published it failing — so publishing the pass is what makes those readable.
Two methodology notes
A single-idiom taint sweep over-reports on default-deny code. Three prior advisories share one mechanism: relabel USER content as
sender=Entity.LLMand the taint filter stops applying. Each advisory blames the handler having nochat_docparameter. Sweep on that and 16 of 24 handlers look unguarded — includingSendTool/AgentSendTool, which are fine. There are three correct taint idioms: doc-derived viachat_doc, the per-toolself._taintedmark, and implicit propagation through thetool_messageslist. On default-deny code the false positives look exactly like the two real CVEs. Enumerate the idioms before counting violations.Cleanest two-install-path split in the series. pip-audit read the
pyproject.tomlfloors and saw nltk 3.10.3 (1 advisory); Trivy readuv.lockand saw nltk 3.10.0 (17). Same package, same scan, both right — averaging them would have destroyed the only signal. The lock governs CI and contributors (uv sync --dev); the Docker image and every PyPI consumer resolve from floors (uv pip install .), so the 83 lockfile advisories touch no shipped artifact.Three criticals died on reachability, each differently:
unstructured's SSRF namespartition(url=)and langroid only calls the file-based partitioners;chainlit's RCE needsfeatures.mcp.enabled, which the shipped config leaves off;chromadbis ceiling-pinned<=0.4.23with no fixed version at all, but both its CVEs describe the ChromaDB server while langroid embeds the client.Published rather than filed
uv.lockpinsgitpython3.1.56 against CVE-2026-78676, a critical config-injection RCE fixed in 3.1.59 — in a package langroid imports in its ownfile_tools.pyandrepo_loader.py. Reachable code, but not in any consumer's environment. There is no.github/dependabot.yml, so nothing is configured to notice. Hygiene, visible to anyone reading the lockfile, not a vulnerability in the shipped library — so it goes in the post, not an issue.Files
docs/scans/langroid-langroid.md— new write-updocs/index.md— new row, counts 101 → 102docs/scan-log.md— new prose entry, count 101 → 102, plus a pre-existing dead link fixed (scans/openai-codex.html→scans/soju06-codex-lb.html), unrelated to this scan🤖 Generated with Claude Code