CVE-2017-14063
📋 TL;DR
Async Http Client versions before 2.0.35 contain a URI parsing vulnerability where a '?' character in a fragment identifier can trick the client into connecting to a different host than intended. This affects applications using vulnerable versions of the async-http-client library for HTTP requests. Similar vulnerabilities were previously found in cURL and Java 8.
💻 Affected Systems
- Async Http Client (async-http-client)
📦 What is this software?
Async Http Client by Asynchttpclient Project
⚠️ Risk & Real-World Impact
Worst Case
Attackers could redirect HTTP requests to malicious servers, potentially leading to credential theft, data exfiltration, or server-side request forgery (SSRF) attacks.
Likely Case
HTTP request manipulation allowing redirection to attacker-controlled servers, potentially intercepting sensitive data or performing unauthorized actions.
If Mitigated
Limited impact if proper input validation and URL sanitization are implemented, or if affected systems don't process untrusted URLs.
🎯 Exploit Status
Exploitation requires the application to process attacker-controlled URLs. Similar vulnerabilities in cURL and Java were actively exploited.
🛠️ Fix & Mitigation
✅ Official Fix
Patch Version: 2.0.35 and later
Vendor Advisory: https://github.com/AsyncHttpClient/async-http-client/issues/1455
Restart Required: Yes
Instructions:
1. Update async-http-client dependency to version 2.0.35 or later. 2. Update pom.xml or build.gradle to specify the fixed version. 3. Rebuild and redeploy the application. 4. Restart any running services using the library.
🔧 Temporary Workarounds
Input validation and sanitization
allImplement strict validation and sanitization of all URLs before passing them to async-http-client, rejecting URLs with '?' in fragment identifiers.
Network restrictions
allImplement outbound firewall rules to restrict HTTP connections to trusted destinations only.
🧯 If You Can't Patch
- Implement strict input validation to reject URLs with '?' characters in fragment identifiers before processing
- Use network segmentation and egress filtering to limit outbound HTTP connections to authorized destinations only
🔍 How to Verify
Check if Vulnerable:
Check the async-http-client version in your project dependencies. If using Maven: mvn dependency:tree | grep async-http-client. If using Gradle: gradle dependencies | grep async-http-client.
Check Version:
mvn dependency:tree | grep async-http-client || gradle dependencies | grep async-http-client
Verify Fix Applied:
After updating, verify the version is 2.0.35 or later using the same commands. Test with sample URLs containing '?' in fragments to ensure proper parsing.
📡 Detection & Monitoring
Log Indicators:
- Unexpected outbound HTTP connections to unknown domains
- HTTP requests with unusual URL structures containing '?' in fragments
Network Indicators:
- HTTP traffic to unexpected destinations from applications using async-http-client
- Unusual redirect patterns in HTTP traffic
SIEM Query:
source="application_logs" AND ("async-http-client" OR "AHC") AND (url CONTAINS "?#" OR url CONTAINS "%3F%23")
🔗 References
- http://openwall.com/lists/oss-security/2017/08/31/4
- https://access.redhat.com/errata/RHSA-2018:2669
- https://github.com/AsyncHttpClient/async-http-client/issues/1455
- https://lists.apache.org/thread.html/r04b15fd898a6b1612153543375daaa8145a0fd1804ec9fa2e0d95c97%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r0a6b6429a7558051dbb70bd06584b4b1c334a80ec9203d3d39b7045a%40%3Ccommits.tez.apache.org%3E
- https://lists.apache.org/thread.html/r14a74d204f285dd3a4fa203de6dbb4e741ddb7fdfff7915590e5b3db%40%3Cdev.tez.apache.org%3E
- https://lists.apache.org/thread.html/r3df4b7ccc363b4850a24842138117aa4451b875bc4773a845b828fc6%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r41a0e2c36f7d1854a4d56cb1e4aa720ef501782d887ece1c9b1e2d60%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r4ebb9596d890f3528630492bd78237b3eef06f093bac238a0da9b630%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5b8666c4414500ff6e993bfa69cb6afa19b1b67c4585a045c0c21662%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5f07c30721503d4c02d5451f77a611a1a0bb2a94ddcdf071c9485ea3%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5f794dc07913c5f2ec08f540813b40e61b562d36f8b1f916e8705c56%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r683d78c6d7a15659f2bb82dd4120dab8c45a870eaa7f1a15cce4ed3b%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r7046a51116207588e36ca8c2e291327e391dae40712d267117475a98%40%3Cdev.tez.apache.org%3E
- https://lists.apache.org/thread.html/r7879a48644f708be0529bd39f0679ad3ad951f3dc24442878a008fd8%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r79d9bab405414af45568c4683386f5e9fd02c10ca87ffa2ee33512dc%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/r868875e67494a18d31e88cba2672f45c3fc6708ffdde445723004da4%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r9ea5d489e004b40baf73880c4e11dd4de24b799d15e091e1f4017108%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rbbad61e1ba5b21e234a6664963618acfee237af754eb20300d938e1e%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rbc4fbb06ccb10e26e6064f57f6bd4935eabe2d18a0cb9a7183699396%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rc550b8955b37b40fee18db99f167337c41c930d8c3763b9631e01dda%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rcb46acc25917e01ebecca132e870da9ab935d5796686ed8a2785b026%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rd0e44e8ef71eeaaa3cf3d1b8b41eb25894372e2995ec908ce7624d26%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/re2510852c4a1f635b14b35e5dfd7597076928e723ab08559ede575e0%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/re7367895ccbf64523efcd39a9181baf2eaa30b069d8d6496852fba56%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rfaa4d578587f52a9c4d176af516a681a712c664e3be440a4163691d5%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/rfd823a733b02cffbef5a69953fdcbed2d1d0afad5e1ea4e96ff6bf0a%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rfe55d83e4070bcc9285bbbf6bc39635dbcbba6d14d89aab0f339c83a%40%3Ccommits.tez.apache.org%3E
- http://openwall.com/lists/oss-security/2017/08/31/4
- https://access.redhat.com/errata/RHSA-2018:2669
- https://github.com/AsyncHttpClient/async-http-client/issues/1455
- https://lists.apache.org/thread.html/r04b15fd898a6b1612153543375daaa8145a0fd1804ec9fa2e0d95c97%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r0a6b6429a7558051dbb70bd06584b4b1c334a80ec9203d3d39b7045a%40%3Ccommits.tez.apache.org%3E
- https://lists.apache.org/thread.html/r14a74d204f285dd3a4fa203de6dbb4e741ddb7fdfff7915590e5b3db%40%3Cdev.tez.apache.org%3E
- https://lists.apache.org/thread.html/r3df4b7ccc363b4850a24842138117aa4451b875bc4773a845b828fc6%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r41a0e2c36f7d1854a4d56cb1e4aa720ef501782d887ece1c9b1e2d60%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r4ebb9596d890f3528630492bd78237b3eef06f093bac238a0da9b630%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5b8666c4414500ff6e993bfa69cb6afa19b1b67c4585a045c0c21662%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5f07c30721503d4c02d5451f77a611a1a0bb2a94ddcdf071c9485ea3%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r5f794dc07913c5f2ec08f540813b40e61b562d36f8b1f916e8705c56%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r683d78c6d7a15659f2bb82dd4120dab8c45a870eaa7f1a15cce4ed3b%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r7046a51116207588e36ca8c2e291327e391dae40712d267117475a98%40%3Cdev.tez.apache.org%3E
- https://lists.apache.org/thread.html/r7879a48644f708be0529bd39f0679ad3ad951f3dc24442878a008fd8%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r79d9bab405414af45568c4683386f5e9fd02c10ca87ffa2ee33512dc%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/r868875e67494a18d31e88cba2672f45c3fc6708ffdde445723004da4%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/r9ea5d489e004b40baf73880c4e11dd4de24b799d15e091e1f4017108%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rbbad61e1ba5b21e234a6664963618acfee237af754eb20300d938e1e%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rbc4fbb06ccb10e26e6064f57f6bd4935eabe2d18a0cb9a7183699396%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rc550b8955b37b40fee18db99f167337c41c930d8c3763b9631e01dda%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rcb46acc25917e01ebecca132e870da9ab935d5796686ed8a2785b026%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rd0e44e8ef71eeaaa3cf3d1b8b41eb25894372e2995ec908ce7624d26%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/re2510852c4a1f635b14b35e5dfd7597076928e723ab08559ede575e0%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/re7367895ccbf64523efcd39a9181baf2eaa30b069d8d6496852fba56%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rfaa4d578587f52a9c4d176af516a681a712c664e3be440a4163691d5%40%3Ccommits.pulsar.apache.org%3E
- https://lists.apache.org/thread.html/rfd823a733b02cffbef5a69953fdcbed2d1d0afad5e1ea4e96ff6bf0a%40%3Cissues.tez.apache.org%3E
- https://lists.apache.org/thread.html/rfe55d83e4070bcc9285bbbf6bc39635dbcbba6d14d89aab0f339c83a%40%3Ccommits.tez.apache.org%3E