CVE-2026-35201 — Vulnerability in rdiscount — CVE Details
MEDIUM
rdiscount has an Out-of-bounds Read
Published April 6, 2026Updated May 13, 2026Source: osv
Summary
### Summary
A signed length truncation bug causes an out-of-bounds read in the default Markdown parse path. Inputs larger than `INT_MAX` are truncated to a signed `int` before entering the native parser, allowing the parser to read past the end of the supplied buffer and crash the process
### Details
In both public entry points:
- `ext/rdiscount.c:97`
- `ext/rdiscount.c:136`
`RSTRING_LEN(text)` is passed directly into `mkd_string()`:
```c
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
```
`mkd_string()` accepts `int len`:
- `ext/mkdio.c:174`
```c
Document * mkd_string(const char *buf, int len, mkd_flag_t flags)
{
struct string_stream about;
about.data = buf;
about.size = len;
return populate((getc_func)__mkd_io_strget, &about, flags & INPUT_MASK);
}
```
The parser stores the remaining input length in a signed `int`:
- `ext/markdown.h:205`
```c
struct string_stream {
const char *data;
int size;
};
```
The read loop stops only when `size == 0`:
- `ext/mkdio.c:161`
```c
int __mkd_io_strget(struct string_stream *in)
{
if ( !in->size ) return EOF;
--(in->size);
return *(in->data)++;
}
```
If the Ruby string length exceeds `INT_MAX`, the value can truncate to a negative `int`. In that state, the parser continues incrementing `data` and reading past the end of the original Ruby string, causing an out-of-bounds read and native crash.
Affected APIs:
- `RDiscount.new(input).to_html`
- `RDiscount.new(input).toc_content`
### PoC
Crash via `to_html`:
```sh
RUBYLIB=lib:ext ruby -e 'require "rdiscount"; n=2_200_000_000; s = "a" * n; warn "built=#{s.bytesize}"; RDiscount.new(s).to_html"'
```
result:
- `built=2200000000`
- Ruby terminates with `[BUG] Segmentation fault`
- top control frame: `CFUNC :to_html`
same result with `toc_content`
### Impact
This is an out-of-bounds read with the main issue being reliable denial-of-service. Impacted is limited to deployments parses attacker-controlled Markdown and permits multi-GB inputs.
### Fix
just add a checked length guard before the `mkd_string()` call in both public entry points:
- `ext/rdiscount.c:97`
- `ext/rdiscount.c:136`
ex:
```c
VALUE text = rb_funcall(self, rb_intern("text"), 0);
long text_len = RSTRING_LEN(text);
VALUE buf = rb_str_buf_new(1024);
Check_Type(text, T_STRING);
if (text_len > INT_MAX) {
rb_raise(rb_eArgError, "markdown input too large");
}
MMIOT *doc = mkd_string(RSTRING_PTR(text), (int)text_len, flags);
```
The same guard should be applied in `rb_rdiscount_toc_content()` before its `mkd_string()` call.
Advisory Timeline
- First published April 6, 2026 (189 days ago).
- Last revised May 13, 2026 — 37 days after initial publication.
Remediation
Upgrade to the fixed version using your package manager.
Bundler
Update rdiscount to 2.2.7.4 or latergem install rdiscount -v 2.2.7.4
After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.
Affected Packages (1)
Affects 1 ecosystem: rubygems (1).
| Package | Ecosystem | Affected | Fixed In |
|---|---|---|---|
| rdiscount | rubygems | 1.3.1.1, 1.3.4, 1.3.5, 1.5.5 (+22 more) | 2.2.7.4 |
Vulnerability Classification
Common Weakness Enumeration (CWE) identifiers for this vulnerability type.
- CWE-125Out-of-bounds ReadMITRE
CVSS Score Breakdown
What the CVSS (Common Vulnerability Scoring System) 5.9 score means for each attack dimension.
Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/davidfstr/rdiscount/security/advisories/GHSA-6r34-94wq-jhrcWEB
- https://nvd.nist.gov/vuln/detail/CVE-2026-35201ADVISORY
- https://github.com/davidfstr/rdiscount/commit/b1a16445e92e0d12c07594dedcdc56f80b317761WEB
- https://github.com/davidfstr/rdiscountPACKAGE
- https://github.com/rubysec/ruby-advisory-db/blob/master/gems/rdiscount/CVE-2026-35201.ymlWEB
- https://github.com/davidfstr/rdiscount/releases/tag/2.2.7.4WEB
Frequently Asked Questions
- What is CVE-2026-35201?
- rdiscount has an Out-of-bounds Read This vulnerability has been assigned a severity rating of MEDIUM (CVSS score: 5.9/10).
- How do I check if my project is affected by CVE-2026-35201?
- CVE-2026-35201 affects rdiscount. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-35201 and 200,000+ other known vulnerabilities.
Severity & Exploitability
CVSS Score
5.9
Exploitation requires specific conditions or has limited impact. Remediate within weeks.
Also Known As
GHSA-6r34-94wq-jhrc
Related CVEs
- CVE-2026-107715MEDIUM
Mechanize sends credential headers to another host after an HTTP redirect
- CVE-2026-107399MEDIUM
Mechanize sends credential headers to another origin after a meta refresh
Check if you're affected
Scan your dependencies to see if this vulnerability affects your projects.
Scan Your Dependencies