Vulnerabilities in pkg:gem/yard
PACKAGECVE-2026-49342 is a MODERATE (CVSS 5.3) yard static cache reads raw vulnerability (CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')) affecting Yard libraries in the RubyGems ecosystem. The issue involves yard static cache reads raw traversal paths before router sanitization. Remediation is available by upgrading affected packages to version 0.9.44.
pkg:gem/yard
Vulnerability advisories affecting package pkg:gem/yard. Select an advisory below to view technical details or fixes.
| Advisory ID | CVE / NVD | Severity | Summary |
|---|---|---|---|
| GHSA-pxcc-8665-phx8 | CVE-2026-49342 | MODERATE | YARD static cache reads raw traversal paths before router sanitization |
| GHSA-3jfp-46x4-xgfj | CVE-2026-41493 | MODERATE | yard: Possible arbitrary path traversal and file access via yard server |
| GHSA-8mq4-9jjh-9xrc | CVE-2024-27285 | MODERATE | YARD's default template vulnerable to Cross-site Scripting in generated frames.html |
| GHSA-xfhh-rx56-rxcr | CVE-2019-1020001 | HIGH | Path Traversal vulnerability that affects yard |
| GHSA-gj4p-3wh3-2rmf | CVE-2017-17042 | HIGH | Arbitrary file read vulnerability in yard server |
CVE-2026-49342 at a Glance
Security Impact
CVSS: 5.3
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N).
How to Fix CVE-2026-49342
To remediate this vulnerability, upgrade all affected Yard dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade yard to 0.9.44
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for yard
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-49342, inspect your project dependencies for Yard:
inspect dependencies for yard
Analyze the terminal output to locate any version of Yard in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.9.44), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'), where the product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory. In Yard, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-49342 Affected Yard Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
yard
|
RubyGems |
< 0.9.44
|
0.9.44
|
References
Frequently Asked Questions
What is CVE-2026-49342?
Which Yard versions are affected?
What version fixes CVE-2026-49342?
Is yard affected?
What is the CVSS score of CVE-2026-49342?
What CWE is associated with CVE-2026-49342?
How can I check RubyGems dependencies for CVE-2026-49342?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-pxcc-8665-phx8",
"modified" : "2026-06-26T22:29:29Z",
"published" : "2026-06-26T22:29:29Z",
"aliases" : [ "CVE-2026-49342" ],
"summary" : "YARD static cache reads raw traversal paths before router sanitization",
"details" : "### Summary\nYARD's static cache lookup reads a request path before the router's path cleanup runs. When a server is configured with a document root, a traversal path such as `/../yard-cache-secret.html` is joined against that root and can return a readable sibling `.html` file outside the intended static tree. \n\nThe potential security risk seems low, as only html-ending files can be read, but still the risk of reading arbitrary html files is a confiendtiality issue in itself, which is why we decided to report. Please let us know if this is out of your project's scope.\n\n### Details\nThe `--docroot` CLI option stores the configured directory in `server_options[:DocumentRoot]` at `lib/yard/cli/server.rb:198`, and adapter initialization copies that value into `adapter.document_root` at `lib/yard/server/adapter.rb:76`. For Rack requests, `RackAdapter#call` builds a request object from the Rack environment at `lib/yard/server/rack_adapter.rb:58` and passes it to `router.call(request)` at `lib/yard/server/rack_adapter.rb:60`. `Router#call` then stores the incoming request at `lib/yard/server/router.rb:55` and invokes `check_static_cache` before normal routing at `lib/yard/server/router.rb:56`. Inside `check_static_cache`, the only initial guard is that `adapter.document_root` is present at `lib/yard/server/static_caching.rb:35`; the cache path is built from `File.join(adapter.document_root, request.path.sub(/\\.html$/, '') + '.html')` at `lib/yard/server/static_caching.rb:36`, without cleaning `..` components first. If that resolved path is a regular file, `File.file?` accepts it at `lib/yard/server/static_caching.rb:38` and the file bytes are returned as a `200` HTML response at `lib/yard/server/static_caching.rb:40`. The later route sanitizer in `final_options` uses `File.cleanpath(...).gsub(...)` at `lib/yard/server/router.rb:181` and `lib/yard/server/router.rb:182`, but a static-cache hit returns before that code is reached.\n\n### PoC\n[poc.zip](https://github.com/user-attachments/files/28185421/poc.zip)\n\n```bash\nbash ./poc/run.sh\n```\nexpected output:\n```text\nrun 1: exit=0 timed_out=False duration=0.08s matched=True phase=oracle fingerprint='YARD_STATIC_CACHE_PATH_TRAVERSAL'\nrun 2: exit=0 timed_out=False duration=0.08s matched=True phase=oracle fingerprint='YARD_STATIC_CACHE_PATH_TRAVERSAL'\nrun 3: exit=0 timed_out=False duration=0.08s matched=True phase=oracle fingerprint='YARD_STATIC_CACHE_PATH_TRAVERSAL'\n```\n\nThe `YARD_STATIC_CACHE_PATH_TRAVERSAL` fingerprint is emitted only after the PoC observes a `200` static-cache response whose body contains the sibling file outside the configured document root. A setup failure, syntax failure, or cache miss would not print this oracle and would not demonstrate this traversal read.\n\n### Impact\nA remote unauthenticated HTTP client who can reach a YARD documentation server with `DocumentRoot`/`--docroot` enabled can request `.html` paths containing parent-directory components and receive readable matching files outside the configured document root. The required guards are narrow: `adapter.document_root` must be set, the traversed target must exist as a regular readable file, and the target must be reachable through the implementation's forced `.html` suffix. Those requests bypass the later `final_options` path cleanup because the cache check runs first. The resulting severity class is information disclosure: response bodies can contain off-root `.html` file contents, but this path does not show write access, code execution, or arbitrary files without the `.html` constraint.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "RubyGems",
"name" : "yard"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.9.44"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/lsegal/yard/security/advisories/GHSA-pxcc-8665-phx8"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-49342"
}, {
"type" : "WEB",
"url" : "https://github.com/lsegal/yard/commit/f78c19f0dd33a407085b4ed181bb60c0aa0078b4"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/lsegal/yard"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-22" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-06-26T22:29:29Z",
"nvd_published_at" : "2026-06-19T20:16:18Z"
}
}