Skip to content
weknoraGHSA-h6gw-8f77-mmmp

WeKnora has DNS Rebinding Vulnerability in web_fetch Tool that Allows SSRF to Internal Resources

High7.5CVE-2026-30858 · Published Mar 6, 2026 · updated Mar 23, 2026

GitHub advisory

Affected versions

PackageAffectedFixed in
github.com/Tencent/WeKnora
Go
< 0.3.00.3.0
Details and references

### Summary A DNS rebinding vulnerability in the `web_fetch` tool allows an unauthenticated attacker to bypass URL validation and access internal resources on the server, including private IP addresses (e.g., 127.0.0.1, 192.168.x.x). By crafting a malicious domain that resolves to a public IP during validation and subsequently resolves to a private IP during execution, an attacker can access sensitive local services and potentially exfiltrate data. ### Details The vulnerability exists because the `web_fetch` tool lacks complete DNS pinning. The application performs URL validation only once via `validateParams()`, but the URL is then passed unchanged to the `fetchHTMLContent()` function, which eventually reaches `fetchWithChromedp()`. The headless browser (Chromedp) resolves the hostname independently without DNS pinning, allowing a time-of-check-time-of-use (TOCTOU) attack. **Validation phase (first DNS resolution):** ```go if err := t.validateParams(p); err != nil { // Returns error for private IPs results[index] = &webFetchItemResult{ err: err, // ... } return } ``` **Execution phase (second DNS resolution):** The original URL (not the resolved IP) is passed through the execution chain: ```go output, data, err := t.executeFetch(ctx, p) // Calls fetchHTMLContent(ctx, targetURL) where targetURL is the original hostname ``` **Chromedp execution (vulnerable DNS resolution):** ```go func (t *WebFetchTool) fetchWithChromedp(ctx context.Context, targetURL string) (string, error) { // targetURL is not DNS-pinned; browser resolves it independently err := chromedp.Run(ctx, chromedp.Navigate(targetURL), // Third DNS lookup occurs here chromedp.WaitReady("body", chromedp.ByQuery), chromedp.OuterHTML("html", &html), ) } ``` The attacker controls a domain that can be configured to return different DNS responses to different queries, enabling them to bypass the initial private IP check and access restricted resources during the actual fetch. ### PoC **Setup:** 1. Deploy the DNS rebinding server (attached Python file) with the following systemd configuration: ```systemd [Unit] Description=DNS Rebinding Test Server After=network.target [Service] Type=simple User=root WorkingDirectory=/root/Repos/dns-rebinding-server ExecStart=/root/.proto/shims/python -u /root/Repos/dns-rebinding-server/server.py --token aleister1102 --domain aleister.ninja --port 53 --global-tracking --ip1 1.1.1.1 --ip2 0.0.0.0 --first-response-count 1 --reset-time 0 Restart=always RestartSec=3 [Install] WantedBy=multi-user.target ``` This configures the DNS server to: - Return `1.1.1.1` (a public IP) for the first DNS query - Return `127.0.0.1` (localhost) for all subsequent queries - TTL is set to 0 to prevent caching The sequence can also be reset via reset.domain.com (reset to 1.1.1.1). > Note: We may need to reset the sequence as the TOCTOU attack is not truly reliable and needs to be triggered multiple times. 2. Set up a simple HTTP server on the localhost of the backend service: ```bash python -m http.server 8888 ``` 3. Configure the malicious domain to point to the DNS rebinding server **Execution:** 1. Enable web search on an agent. 2. Prompt the agent to fetch content from the attacker-controlled domain (e.g., `http://attacker.example.com`) 3. The sequence of events: - **First DNS query** (validation phase): `attacker.example.com` → `1.1.1.1` ✓ Passes validation - **Second DNS query** (execution phase): `attacker.example.com` → `127.0.0.1` ✗ Bypass achieved - The `web_fetch` tool successfully connects to `127.0.0.1:8080` and returns the local server's content **Result:** The attacker gains access to the local HTTP server and can read its content, demonstrating that internal resources are now accessible through the rebinding attack. <img width="1920" height="1080" alt="image" src="https://github.com/user-attachments/assets/897e8494-f39e-49ce-a02a-5832bb84

CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Severity from
GitHub (reviewed advisory)
Weakness
CWE-918
Also known as
CVE-2026-30858, GO-2026-4643

More weknora advisories

All
DateAdvisory
Mar 5WeKnora is Vulnerable to SSRF via Redirection
CVE-2026-30247Medium5.9fixed in 0.2.12
Mar 6WeKnora Vulnerable to Broken Access Control in Tenant Management
CVE-2026-30855Critical9.8fixed in 0.3.2
Mar 6WeKnora Vulnerable to Tool Execution Hijacking via Ambigous Naming Convention In MCP client and Indirect Prompt Injection
CVE-2026-30856Medium5.4fixed in 0.3.0
Mar 6WeKnora has Unauthorized Cross‑Tenant Knowledge Base Cloning
CVE-2026-30857Medium5.9fixed in 0.3.0
Mar 6WeKnora has Broken Access Control - Cross-Tenant Data Exposure
CVE-2026-30859High7.5fixed in 0.2.12
Mar 6WeKnora Vulnerable to Remote Code Execution via SQL Injection Bypass in AI Database Query Tool
CVE-2026-30860Critical10.0fixed in 0.2.12

Critical advisories by email

Wednesdays: the week’s critical and high advisories in the AI and data stack, with the fixed versions. Only in weeks that have some.

Double opt-in. Unsubscribe any time.