comparison mupdf-source/thirdparty/curl/docs/libcurl/libcurl-security.3 @ 2:b50eed0cc0ef upstream

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