libcurl-security.3 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. .\" **************************************************************************
  2. .\" * _ _ ____ _
  3. .\" * Project ___| | | | _ \| |
  4. .\" * / __| | | | |_) | |
  5. .\" * | (__| |_| | _ <| |___
  6. .\" * \___|\___/|_| \_\_____|
  7. .\" *
  8. .\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  9. .\" *
  10. .\" * This software is licensed as described in the file COPYING, which
  11. .\" * you should have received as part of this distribution. The terms
  12. .\" * are also available at https://curl.se/docs/copyright.html.
  13. .\" *
  14. .\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
  15. .\" * copies of the Software, and permit persons to whom the Software is
  16. .\" * furnished to do so, under the terms of the COPYING file.
  17. .\" *
  18. .\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  19. .\" * KIND, either express or implied.
  20. .\" *
  21. .\" **************************************************************************
  22. .\"
  23. .TH libcurl-security 3 "13 Feb 2018" "libcurl" "libcurl security"
  24. .SH NAME
  25. libcurl-security \- security considerations when using libcurl
  26. .SH "Security"
  27. The libcurl project takes security seriously. The library is written with
  28. caution and precautions are taken to mitigate many kinds of risks encountered
  29. while operating with potentially malicious servers on the Internet. It is a
  30. powerful library, however, which allows application writers to make trade-offs
  31. between ease of writing and exposure to potential risky operations. If used
  32. the right way, you can use libcurl to transfer data pretty safely.
  33. Many applications are used in closed networks where users and servers can
  34. (possibly) be trusted, but many others are used on arbitrary servers and are
  35. fed input from potentially untrusted users. Following is a discussion about
  36. some risks in the ways in which applications commonly use libcurl and
  37. potential mitigations of those risks. It is by no means comprehensive, but
  38. shows classes of attacks that robust applications should consider. The Common
  39. Weakness Enumeration project at https://cwe.mitre.org/ is a good reference for
  40. many of these and similar types of weaknesses of which application writers
  41. should be aware.
  42. .SH "Command Lines"
  43. If you use a command line tool (such as curl) that uses libcurl, and you give
  44. options to the tool on the command line those options can very likely get read
  45. by other users of your system when they use 'ps' or other tools to list
  46. currently running processes.
  47. To avoid these problems, never feed sensitive things to programs using command
  48. line options. Write them to a protected file and use the \-K option to avoid
  49. this.
  50. .SH ".netrc"
  51. \&.netrc is a pretty handy file/feature that allows you to login quickly and
  52. automatically to frequently visited sites. The file contains passwords in
  53. clear text and is a real security risk. In some cases, your .netrc is also
  54. stored in a home directory that is NFS mounted or used on another network
  55. based file system, so the clear text password will fly through your network
  56. every time anyone reads that file!
  57. For applications that enable .netrc use, a user who manage to set the right
  58. URL might then be possible to pass on passwords.
  59. To avoid these problems, don't use .netrc files and never store passwords in
  60. plain text anywhere.
  61. .SH "Clear Text Passwords"
  62. Many of the protocols libcurl supports send name and password unencrypted as
  63. clear text (HTTP Basic authentication, FTP, TELNET etc). It is very easy for
  64. anyone on your network or a network nearby yours to just fire up a network
  65. analyzer tool and eavesdrop on your passwords. Don't let the fact that HTTP
  66. Basic uses base64 encoded passwords fool you. They may not look readable at a
  67. first glance, but they very easily "deciphered" by anyone within seconds.
  68. To avoid this problem, use an authentication mechanism or other protocol that
  69. doesn't let snoopers see your password: Digest, CRAM-MD5, Kerberos, SPNEGO or
  70. NTLM authentication. Or even better: use authenticated protocols that protect
  71. the entire connection and everything sent over it.
  72. .SH "Un-authenticated Connections"
  73. Protocols that don't have any form of cryptographic authentication cannot
  74. with any certainty know that they communicate with the right remote server.
  75. If your application is using a fixed scheme or fixed host name, it is not safe
  76. as long as the connection is un-authenticated. There can be a
  77. man-in-the-middle or in fact the whole server might have been replaced by an
  78. evil actor.
  79. Un-authenticated protocols are unsafe. The data that comes back to curl may
  80. have been injected by an attacker. The data that curl sends might be modified
  81. before it reaches the intended server. If it even reaches the intended server
  82. at all.
  83. Remedies:
  84. .IP "Restrict operations to authenticated transfers"
  85. Ie use authenticated protocols protected with HTTPS or SSH.
  86. .IP "Make sure the server's certificate etc is verified"
  87. Never ever switch off certificate verification.
  88. .SH "Redirects"
  89. The \fICURLOPT_FOLLOWLOCATION(3)\fP option automatically follows HTTP
  90. redirects sent by a remote server. These redirects can refer to any kind of
  91. URL, not just HTTP. libcurl restricts the protocols allowed to be used in
  92. redirects for security reasons: only HTTP, HTTPS, FTP and FTPS are
  93. enabled by default. Applications may opt to restrict that set further.
  94. A redirect to a file: URL would cause the libcurl to read (or write) arbitrary
  95. files from the local filesystem. If the application returns the data back to
  96. the user (as would happen in some kinds of CGI scripts), an attacker could
  97. leverage this to read otherwise forbidden data (e.g.
  98. file://localhost/etc/passwd).
  99. If authentication credentials are stored in the ~/.netrc file, or Kerberos
  100. is in use, any other URL type (not just file:) that requires
  101. authentication is also at risk. A redirect such as
  102. ftp://some-internal-server/private-file would then return data even when
  103. the server is password protected.
  104. In the same way, if an unencrypted SSH private key has been configured for the
  105. user running the libcurl application, SCP: or SFTP: URLs could access password
  106. or private-key protected resources,
  107. e.g. sftp://user@some-internal-server/etc/passwd
  108. The \fICURLOPT_REDIR_PROTOCOLS(3)\fP and \fICURLOPT_NETRC(3)\fP options can be
  109. used to mitigate against this kind of attack.
  110. A redirect can also specify a location available only on the machine running
  111. libcurl, including servers hidden behind a firewall from the attacker.
  112. e.g. http://127.0.0.1/ or http://intranet/delete-stuff.cgi?delete=all or
  113. tftp://bootp-server/pc-config-data
  114. Applications can mitigate against this by disabling
  115. \fICURLOPT_FOLLOWLOCATION(3)\fP and handling redirects itself, sanitizing URLs
  116. as necessary. Alternately, an app could leave \fICURLOPT_FOLLOWLOCATION(3)\fP
  117. enabled but set \fICURLOPT_REDIR_PROTOCOLS(3)\fP and install a
  118. \fICURLOPT_OPENSOCKETFUNCTION(3)\fP callback function in which addresses are
  119. sanitized before use.
  120. .SH "Local Resources"
  121. A user who can control the DNS server of a domain being passed in within a URL
  122. can change the address of the host to a local, private address which a
  123. server-side libcurl-using application could then use. e.g. the innocuous URL
  124. http://fuzzybunnies.example.com/ could actually resolve to the IP address of a
  125. server behind a firewall, such as 127.0.0.1 or 10.1.2.3. Applications can
  126. mitigate against this by setting a \fICURLOPT_OPENSOCKETFUNCTION(3)\fP and
  127. checking the address before a connection.
  128. All the malicious scenarios regarding redirected URLs apply just as well to
  129. non-redirected URLs, if the user is allowed to specify an arbitrary URL that
  130. could point to a private resource. For example, a web app providing a
  131. translation service might happily translate file://localhost/etc/passwd and
  132. display the result. Applications can mitigate against this with the
  133. \fICURLOPT_PROTOCOLS(3)\fP option as well as by similar mitigation techniques
  134. for redirections.
  135. A malicious FTP server could in response to the PASV command return an IP
  136. address and port number for a server local to the app running libcurl but
  137. behind a firewall. Applications can mitigate against this by using the
  138. \fICURLOPT_FTP_SKIP_PASV_IP(3)\fP option or \fICURLOPT_FTPPORT(3)\fP.
  139. Local servers sometimes assume local access comes from friends and trusted
  140. users. An application that expects https://example.com/file_to_read that and
  141. instead gets http://192.168.0.1/my_router_config might print a file that would
  142. otherwise be protected by the firewall.
  143. Allowing your application to connect to local hosts, be it the same machine
  144. that runs the application or a machine on the same local network, might be
  145. possible to exploit by an attacker who then perhaps can "port-scan" the
  146. particular hosts - depending on how the application and servers acts.
  147. .SH "IPv6 Addresses"
  148. libcurl will normally handle IPv6 addresses transparently and just as easily
  149. as IPv4 addresses. That means that a sanitizing function that filters out
  150. addresses like 127.0.0.1 isn't sufficient--the equivalent IPv6 addresses ::1,
  151. ::, 0:00::0:1, ::127.0.0.1 and ::ffff:7f00:1 supplied somehow by an attacker
  152. would all bypass a naive filter and could allow access to undesired local
  153. resources. IPv6 also has special address blocks like link-local and
  154. site-local that generally shouldn't be accessed by a server-side libcurl-using
  155. application. A poorly-configured firewall installed in a data center,
  156. organization or server may also be configured to limit IPv4 connections but
  157. leave IPv6 connections wide open. In some cases, setting
  158. \fICURLOPT_IPRESOLVE(3)\fP to CURL_IPRESOLVE_V4 can be used to limit resolved
  159. addresses to IPv4 only and bypass these issues.
  160. .SH Uploads
  161. When uploading, a redirect can cause a local (or remote) file to be
  162. overwritten. Applications must not allow any unsanitized URL to be passed in
  163. for uploads. Also, \fICURLOPT_FOLLOWLOCATION(3)\fP should not be used on
  164. uploads. Instead, the applications should consider handling redirects itself,
  165. sanitizing each URL first.
  166. .SH Authentication
  167. Use of \fICURLOPT_UNRESTRICTED_AUTH(3)\fP could cause authentication
  168. information to be sent to an unknown second server. Applications can mitigate
  169. against this by disabling \fICURLOPT_FOLLOWLOCATION(3)\fP and handling
  170. redirects itself, sanitizing where necessary.
  171. Use of the CURLAUTH_ANY option to \fICURLOPT_HTTPAUTH(3)\fP could result in
  172. user name and password being sent in clear text to an HTTP server. Instead,
  173. use CURLAUTH_ANYSAFE which ensures that the password is encrypted over the
  174. network, or else fail the request.
  175. Use of the CURLUSESSL_TRY option to \fICURLOPT_USE_SSL(3)\fP could result in
  176. user name and password being sent in clear text to an FTP server. Instead,
  177. use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or else
  178. fail the request.
  179. .SH Cookies
  180. If cookies are enabled and cached, then a user could craft a URL which
  181. performs some malicious action to a site whose authentication is already
  182. stored in a cookie. e.g. http://mail.example.com/delete-stuff.cgi?delete=all
  183. Applications can mitigate against this by disabling cookies or clearing them
  184. between requests.
  185. .SH "Dangerous SCP URLs"
  186. SCP URLs can contain raw commands within the scp: URL, which is a side effect
  187. of how the SCP protocol is designed. e.g.
  188. scp://user:pass@host/a;date >/tmp/test;
  189. Applications must not allow unsanitized SCP: URLs to be passed in for
  190. downloads.
  191. .SH "file://"
  192. By default curl and libcurl support file:// URLs. Such a URL is always an
  193. access, or attempted access, to a local resource. If your application wants to
  194. avoid that, keep control of what URLs to use and/or prevent curl/libcurl from
  195. using the protocol.
  196. By default, libcurl prohibits redirects to file:// URLs.
  197. .SH "Warning: file:// on Windows"
  198. The Windows operating system will automatically, and without any way for
  199. applications to disable it, try to establish a connection to another host over
  200. the network and access it (over SMB or other protocols), if only the correct
  201. file path is accessed.
  202. When first realizing this, the curl team tried to filter out such attempts in
  203. order to protect applications for inadvertent probes of for example internal
  204. networks etc. This resulted in CVE-2019-15601 and the associated security fix.
  205. However, we've since been made aware of the fact that the previous fix was far
  206. from adequate as there are several other ways to accomplish more or less the
  207. same thing: accessing a remote host over the network instead of the local file
  208. system.
  209. The conclusion we have come to is that this is a weakness or feature in the
  210. Windows operating system itself, that we as an application cannot safely
  211. protect users against. It would just be a whack-a-mole race we don't want to
  212. participate in. There are too many ways to do it and there's no knob we can
  213. use to turn off the practice.
  214. If you use curl or libcurl on Windows (any version), disable the use of the
  215. FILE protocol in curl or be prepared that accesses to a range of "magic paths"
  216. will potentially make your system try to access other hosts on your
  217. network. curl cannot protect you against this.
  218. .SH "What if the user can set the URL"
  219. Applications may find it tempting to let users set the URL that it can work
  220. on. That's probably fine, but opens up for mischief and trickery that you as
  221. an application author may want to address or take precautions against.
  222. If your curl-using script allow a custom URL do you also, perhaps
  223. unintentionally, allow the user to pass other options to the curl command line
  224. if creative use of special characters are applied?
  225. If the user can set the URL, the user can also specify the scheme part to
  226. other protocols that you didn't intend for users to use and perhaps didn't
  227. consider. curl supports over 20 different URL schemes. "http://" might be what
  228. you thought, "ftp://" or "imap://" might be what the user gives your
  229. application. Also, cross-protocol operations might be done by using a
  230. particular scheme in the URL but point to a server doing a different protocol
  231. on a non-standard port.
  232. Remedies:
  233. .IP "Use --proto"
  234. curl command lines can use \fI--proto\fP to limit what URL schemes it accepts
  235. .IP "Use CURLOPT_PROTOCOLS"
  236. libcurl programs can use \fICURLOPT_PROTOCOLS(3)\fP to limit what URL schemes it accepts
  237. .IP "consider not allowing the user to set the full URL"
  238. Maybe just let the user provide data for parts of it? Or maybe filter input to
  239. only allow specific choices?
  240. .SH "RFC 3986 vs WHATWG URL"
  241. curl supports URLs mostly according to how they are defined in RFC 3986, and
  242. has done so since the beginning.
  243. Web browsers mostly adhere to the WHATWG URL Specification.
  244. This deviance makes some URLs copied between browsers (or returned over HTTP
  245. for redirection) and curl not work the same way. This can mislead users into
  246. getting the wrong thing, connecting to the wrong host or otherwise not work
  247. identically.
  248. .SH "FTP uses two connections"
  249. When performing an FTP transfer, two TCP connections are used: one for setting
  250. up the transfer and one for the actual data.
  251. FTP is not only un-authenticated, but the setting up of the second transfer is
  252. also a weak spot. The second connection to use for data, is either setup with
  253. the PORT/EPRT command that makes the server connect back to the client on the
  254. given IP+PORT, or with PASV/EPSV that makes the server setup a port to listen
  255. to and tells the client to connect to a given IP+PORT.
  256. Again, un-authenticated means that the connection might be meddled with by a
  257. man-in-the-middle or that there's a malicious server pretending to be the
  258. right one.
  259. A malicious FTP server can respond to PASV commands with the IP+PORT of a
  260. totally different machine. Perhaps even a third party host, and when there are
  261. many clients trying to connect to that third party, it could create a
  262. Distributed Denial-Of-Service attack out of it! If the client makes an upload
  263. operation, it can make the client send the data to another site. If the
  264. attacker can affect what data the client uploads, it can be made to work as a
  265. HTTP request and then the client could be made to issue HTTP requests to third
  266. party hosts.
  267. An attacker that manages to control curl's command line options can tell curl
  268. to send an FTP PORT command to ask the server to connect to a third party host
  269. instead of back to curl.
  270. The fact that FTP uses two connections makes it vulnerable in a way that is
  271. hard to avoid.
  272. .SH "Denial of Service"
  273. A malicious server could cause libcurl to effectively hang by sending data
  274. very slowly, or even no data at all but just keeping the TCP connection open.
  275. This could effectively result in a denial-of-service attack. The
  276. \fICURLOPT_TIMEOUT(3)\fP and/or \fICURLOPT_LOW_SPEED_LIMIT(3)\fP options can
  277. be used to mitigate against this.
  278. A malicious server could cause libcurl to download an infinite amount of data,
  279. potentially causing all of memory or disk to be filled. Setting the
  280. \fICURLOPT_MAXFILESIZE_LARGE(3)\fP option is not sufficient to guard against
  281. this. Instead, applications should monitor the amount of data received within
  282. the write or progress callback and abort once the limit is reached.
  283. A malicious HTTP server could cause an infinite redirection loop, causing a
  284. denial-of-service. This can be mitigated by using the
  285. \fICURLOPT_MAXREDIRS(3)\fP option.
  286. .SH "Arbitrary Headers"
  287. User-supplied data must be sanitized when used in options like
  288. \fICURLOPT_USERAGENT(3)\fP, \fICURLOPT_HTTPHEADER(3)\fP,
  289. \fICURLOPT_POSTFIELDS(3)\fP and others that are used to generate structured
  290. data. Characters like embedded carriage returns or ampersands could allow the
  291. user to create additional headers or fields that could cause malicious
  292. transactions.
  293. .SH "Server-supplied Names"
  294. A server can supply data which the application may, in some cases, use as a
  295. file name. The curl command-line tool does this with
  296. \fI--remote-header-name\fP, using the Content-disposition: header to generate
  297. a file name. An application could also use \fICURLINFO_EFFECTIVE_URL(3)\fP to
  298. generate a file name from a server-supplied redirect URL. Special care must be
  299. taken to sanitize such names to avoid the possibility of a malicious server
  300. supplying one like "/etc/passwd", "\\autoexec.bat", "prn:" or even ".bashrc".
  301. .SH "Server Certificates"
  302. A secure application should never use the \fICURLOPT_SSL_VERIFYPEER(3)\fP
  303. option to disable certificate validation. There are numerous attacks that are
  304. enabled by applications that fail to properly validate server TLS/SSL
  305. certificates, thus enabling a malicious server to spoof a legitimate
  306. one. HTTPS without validated certificates is potentially as insecure as a
  307. plain HTTP connection.
  308. .SH "Report Security Problems"
  309. Should you detect or just suspect a security problem in libcurl or curl,
  310. contact the project curl security team immediately. See
  311. https://curl.se/dev/secprocess.html for details.
  312. .SH "Showing What You Do"
  313. Relatedly, be aware that in situations when you have problems with libcurl and
  314. ask someone for help, everything you reveal in order to get best possible help
  315. might also impose certain security related risks. Host names, user names,
  316. paths, operating system specifics, etc. (not to mention passwords of course)
  317. may in fact be used by intruders to gain additional information of a potential
  318. target.
  319. Be sure to limit access to application logs if they could hold private or
  320. security-related data. Besides the obvious candidates like user names and
  321. passwords, things like URLs, cookies or even file names could also hold
  322. sensitive data.
  323. To avoid this problem, you must of course use your common sense. Often, you
  324. can just edit out the sensitive data or just search/replace your true
  325. information with faked data.