Nodes were potentially vulnerable to a buffer overflow by malicious SOCKS servers. A fix was released on November 6th, 2017 in Bitcoin Core version 0.15.1.

Technical Details

CVE-2017-18350 is a buffer overflow vulnerability which allows a malicious SOCKS proxy server to overwrite the program stack on systems with a signed char type (including common 32-bit and 64-bit x86 PCs).

The vulnerability was introduced in 60a87bce873 (SOCKS5 support) and first released in Bitcoin Core v0.7.0rc1 in 2012 Aug 27. A fix was hidden in d90a00eabed (“Improve and document SOCKS code”) released in v0.15.1, 2017 Nov 6.

To be vulnerable, the node must be configured to use such a malicious proxy in the first place. Note that using any proxy over an insecure network (such as the Internet) is potentially a vulnerability since the connection could be intercepted for such a purpose.

Upon a connection request from the node, the malicious proxy would respond with an acknowledgement of a different target domain name than the one requested. Normally this acknowledgement is entirely ignored, but if the length uses the high bit (ie, a length 128-255 inclusive), it will be interpreted by vulnerable versions as a negative number instead. When the negative number is passed to the recv() system call to read the domain name, it is converted back to an unsigned/positive number, but at a much wider size (typically 32-bit), resulting in an effectively infinite read into and beyond the 256-byte dummy stack buffer.

To fix this vulnerability, the dummy buffer was changed to an explicitly unsigned data type, avoiding the conversion to/from a negative number.

Attribution

Credit goes to practicalswift for discovering and providing the initial fix for the vulnerability, and Wladimir J. van der Laan for a disguised version of the fix as well as general cleanup to the at-risk code.

Timeline

  • 2012-04-01: Vulnerability introduced in PR #1141.
  • 2012-05-08: Vulnerability merged to master git repository.
  • 2012-08-27: Vulnerability published in v0.7.0rc1.
  • 2012-09-17: Vulnerability released in v0.7.0.
  • 2017-09-21: practicalswift discloses vulnerability to security team.
  • 2017-09-23: Wladimir opens PR #11397 to quietly fix vulnerability.
  • 2017-09-27: Fix merged to master git repository.
  • 2017-10-18: Fix merged to 0.15 git repository.
  • 2017-11-04: Fix published in v0.15.1rc1.
  • 2017-11-09: Fix released in v0.15.1.
  • 2019-06-22: Vulnerability existence disclosed to bitcoin-dev ML.
  • 2019-11-08: Vulnerability details disclosure to bitcoin-dev ML.