Annotation of embedaddon/curl/docs/libcurl/libcurl-security.3, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>