doc: Document security issues involving LWP::UserAgent

Recommend the LWPx::ParanoidAgent module where appropriate.
It is particularly important for openid, since unauthenticated users
can control which URLs that plugin will contact. Conversely, it is
non-critical for blogspam, since the URL to be contacted is under
the wiki administrator's control.

Signed-off-by: Simon McVittie <smcv@debian.org>
master
Simon McVittie 2019-02-10 16:56:41 +00:00
parent d283e4ca1a
commit 9a275b2f18
6 changed files with 87 additions and 5 deletions

View File

@ -11,6 +11,10 @@ The [[meta]] and [[tag]] plugins are also recommended to be used with this
one. Either the [[htmltidy]] or [[htmlbalance]] plugin is suggested, since
feeds can easily contain html problems, some of which these plugins can fix.
Installing the [[!cpan LWPx::ParanoidAgent]] Perl module is strongly
recommended. The [[!cpan LWP]] module can also be used, but is susceptible
to server-side request forgery.
## triggering aggregation
You will need to run ikiwiki periodically from a cron job, passing it the

View File

@ -11,6 +11,8 @@ To check for and moderate comments, log in to the wiki as an admin,
go to your Preferences page, and click the "Comment Moderation" button.
The plugin requires the [[!cpan JSON]] perl module.
The [[!cpan LWPx::ParanoidAgent]] Perl module is recommended,
although this plugin can also fall back to [[!cpan LWP]].
You can control how content is tested via the `blogspam_options` setting.
The list of options is [here](http://blogspam.net/api/2.0/testComment.html#options).

View File

@ -7,8 +7,11 @@ into the wiki.
The plugin needs the [[!cpan Net::OpenID::Consumer]] perl module.
Version 1.x is needed in order for OpenID v2 to work.
The [[!cpan LWPx::ParanoidAgent]] perl module is used if available, for
added security. Finally, the [[!cpan Crypt::SSLeay]] perl module is needed
The [[!cpan LWPx::ParanoidAgent]] Perl module is strongly recommended.
The [[!cpan LWP]] module can also be used, but is susceptible to
server-side request forgery.
The [[!cpan Crypt::SSLeay]] Perl module is needed
to support users entering "https" OpenID urls.
This plugin is enabled by default, but can be turned off if you want to

View File

@ -10,9 +10,11 @@ can be kept up-to-date.
To configure what URLs to ping, use the [[ikiwiki/directive/ping]]
[[ikiwiki/directive]].
The [[!cpan LWP]] perl module is used for pinging. Or the [[!cpan
LWPx::ParanoidAgent]] perl module is used if available, for added security.
Finally, the [[!cpan Crypt::SSLeay]] perl module is needed to support pinging
The [[!cpan LWPx::ParanoidAgent]] Perl module is strongly recommended.
The [[!cpan LWP]] module can also be used, but is susceptible
to server-side request forgery.
The [[!cpan Crypt::SSLeay]] perl module is needed to support pinging
"https" urls.
By default the pinger will try to ping a site for 15 seconds before timing

View File

@ -611,3 +611,52 @@ This was fixed in ikiwiki 3.20170111, with fixes backported to Debian 8
in version 3.20141016.4.
([[!debcve CVE-2017-0356]]/OVE-20170111-0001)
## Server-side request forgery via aggregate plugin
The ikiwiki maintainers discovered that the [[plugins/aggregate]] plugin
did not use [[!cpan LWPx::ParanoidAgent]]. On sites where the
aggregate plugin is enabled, authorized wiki editors could tell ikiwiki
to fetch potentially undesired URIs even if LWPx::ParanoidAgent was
installed:
* local files via `file:` URIs
* other URI schemes that might be misused by attackers, such as `gopher:`
* hosts that resolve to loopback IP addresses (127.x.x.x)
* hosts that resolve to RFC 1918 IP addresses (192.168.x.x etc.)
This could be used by an attacker to publish information that should not have
been accessible, cause denial of service by requesting "tarpit" URIs that are
slow to respond, or cause undesired side-effects if local web servers implement
["unsafe"](https://tools.ietf.org/html/rfc7231#section-4.2.1) GET requests.
([[!debcve CVE-2019-9187]])
Additionally, if the LWPx::ParanoidAgent module was not installed, the
[[plugins/blogspam]], [[plugins/openid]] and [[plugins/pinger]] plugins
would fall back to [[!cpan LWP]], which is susceptible to similar attacks.
This is unlikely to be a practical problem for the blogspam plugin because
the URL it requests is under the control of the wiki administrator, but
the openid plugin can request URLs controlled by unauthenticated remote
users, and the pinger plugin can request URLs controlled by authorized
wiki editors.
This is addressed in ikiwiki 3.20190228 as follows, with the same fixes
backported to Debian 9 in version 3.20170111.1:
* URI schemes other than `http:` and `https:` are not accepted, preventing
access to `file:`, `gopher:`, etc.
* If a proxy is [[configured in the ikiwiki setup file|tips/using_a_proxy]],
it is used for all outgoing `http:` and `https:` requests. In this case
the proxy is responsible for blocking any requests that are undesired,
including loopback or RFC 1918 addresses.
* If a proxy is not configured, and LWPx::ParanoidAgent is installed,
it will be used. This prevents loopback and RFC 1918 IP addresses, and
sets a timeout to avoid denial of service via "tarpit" URIs.
* Otherwise, the ordinary LWP user-agent will be used. This allows requests
to loopback and RFC 1918 IP addresses, and has less robust timeout
behaviour. We are not treating this as a vulnerability: if this
behaviour is not acceptable for your site, please make sure to install
LWPx::ParanoidAgent or disable the affected plugins.

View File

@ -0,0 +1,22 @@
Some ikiwiki plugins make outgoing HTTP requests from the web server:
* [[plugins/aggregate]] (to download Atom and RSS feeds)
* [[plugins/blogspam]] (to check whether a comment or edit is spam)
* [[plugins/openid]] (to authenticate users)
* [[plugins/pinger]] (to ping other ikiwiki installations)
If your ikiwiki installation cannot contact the Internet without going
through a proxy, you can configure this in the [[setup file|setup]] by
setting environment variables:
ENV:
http_proxy: "http://proxy.example.com:8080"
https_proxy: "http://proxy.example.com:8080"
# optional
no_proxy: ".example.com,www.example.org"
Note that some plugins will use the configured proxy for all destinations,
even if they are listed in `no_proxy`.
To avoid server-side request forgery attacks, ensure that your proxy does
not allow requests to addresses that are considered to be internal.