po: more security-related reports

Signed-off-by: intrigeri <intrigeri@boum.org>
master
intrigeri 2009-01-15 20:01:54 +01:00
parent 196f03a987
commit 48de7f9c7b
1 changed files with 24 additions and 85 deletions

View File

@ -301,8 +301,6 @@ an initial goal, and analysing in detail the possible issues.
read any file. NB: this hack depends on po4a internals to stay read any file. NB: this hack depends on po4a internals to stay
the same. the same.
#### To be checked
##### Locale::Po4a modules ##### Locale::Po4a modules
The modules we want to use have to be checked, as not all are safe The modules we want to use have to be checked, as not all are safe
@ -321,52 +319,19 @@ means the `Text` module only.
> Freaky code, but seems ok due to use of `quotementa`. > Freaky code, but seems ok due to use of `quotementa`.
#### To be checked
##### Text::WrapI18N ##### Text::WrapI18N
`Text::WrapI18N` can cause DoS (see the `Text::WrapI18N` can cause DoS (see the
[Debian bug #470250](http://bugs.debian.org/470250)), but it is [Debian bug #470250](http://bugs.debian.org/470250)), but it is
optional and we do not need the features it provides. optional and we do not need the features it provides.
It is loaded if available by `Locale::Po4a::Common`; looking at the > I proposed a patch based on Joey's to po4a-devel, allowing to fully
code, I'm not sure we can prevent this at all, but maybe some symbol > disable this module's use. When it is merged upstream, we'll need to add
table manipulation tricks could work; overriding > `use Locale::Po4a::Common qw(nowrapi18n)` to `po.pm`, before loading
`Locale::Po4a::Common::wrapi18n` may be easier. I'm no expert at all > any other `Locale::Po4a` module. A versioned dependency may be needed.
in this field. Joey? [[--intrigeri]] > --[[intrigeri]]
> Update: Nicolas François suggests we add an option to po4a to
> disable it. It would do the trick, but only for people running
> a brand new po4a (probably too late for Lenny). Anyway, this option
> would have to take effect in a `BEGIN` / `eval` that I'm not
> familiar with. I can learn and do it, in case no Perl wizard
> volunteers to provide the po4a patch. [[--intrigeri]]
>> That doesn't really need to be in a BEGIN. This patch moves it to
>> `import`, and makes this disable wrap18n:
>> `use Locale::Po4a::Common q{nowrapi18n}` --[[Joey]]
<pre>
--- /usr/share/perl5/Locale/Po4a/Common.pm 2008-07-21 14:54:52.000000000 -0400
+++ Common.pm 2008-11-11 18:27:34.000000000 -0500
@@ -30,8 +30,16 @@
use strict;
use warnings;
-BEGIN {
- if (eval { require Text::WrapI18N }) {
+sub import {
+ my $class=shift;
+ my $wrapi18n=1;
+ if ($_[0] eq 'nowrapi18n') {
+ shift;
+ $wrapi18n=0;
+ }
+ $class->export_to_level(1, $class, @_);
+
+ if ($wrapi18n && eval { require Text::WrapI18N }) {
# Don't bother determining the wrap column if we cannot wrap.
my $col=$ENV{COLUMNS};
</pre>
##### Term::ReadKey ##### Term::ReadKey
@ -375,47 +340,30 @@ works nicely without it. But the po4a Debian package recommends
`libterm-readkey-perl`, so it will probably be installed on most `libterm-readkey-perl`, so it will probably be installed on most
systems using the po plugin. systems using the po plugin.
If `$ENV{COLUMNS}` is not set, `Locale::Po4a::Common` uses `Term::ReadKey` has too far reaching implications for us to
`Term::ReadKey::GetTerminalSize()` to get the terminal size. How safe be able to guarantee anything wrt. security.
is this?
Part of `Term::ReadKey` is written in C. Depending on the runtime > The option that disables `Text::WrapI18N` also disables
platform, this function use ioctl, environment, or C library function > `Term::ReadKey` as a consequence. [[--intrigeri]]
calls, and may end up running the `resize` command (without
arguments).
IMHO, using Term::ReadKey has too far reaching implications for us to
be able to guarantee anything wrt. security. Since it is anyway of no
use in our case, I suggest we define `ENV{COLUMNS}` before loading
`Locale::Po4a::Common`, just to be on the safe side. Joey?
[[--intrigeri]]
> Update: adding an option to disable `Text::WrapI18N`, as Nicolas
> François suggested, would as a bonus disable `Term::ReadKey`
> as well. [[--intrigeri]]
### msgmerge ### msgmerge
`refreshpofiles()` runs this external program. A po4a developer `refreshpofiles()` runs this external program.
answered he does "not expect any security issues from it".
A po4a developer answered he does "not expect any security issues from
it". I did not manage to crash it with `zzuf`, nor was able to find
any past security holes.
### msgfmt ### msgfmt
`isvalidpo()` runs this external program. Its security should be checked. `isvalidpo()` runs this external program.
* I could not manage to make it behave badly using zzuf, it exits
cleanly when too many errors are detected.
* I could not find any past security holes.
### Fuzzing input ### Fuzzing input
I was not able to find any public information about gettext or po4a
having been tested with a fuzzing program, such as `zzuf` or `fusil`.
Moreover, some gettext parsers seem to be quite
[easy to crash](http://fusil.hachoir.org/trac/browser/trunk/fuzzers/fusil-gettext),
so it might be useful to bang msgmerge/po4a's heads against such
a program in order to easily detect some of the most obvious DoS.
[[--intrigeri]]
> po4a was not fuzzy-tested, but according to one of its developers,
> "it would be really appreciated". [[--intrigeri]]
Test conditions: Test conditions:
- a 21M file containing 100 concatenated copies of all the files in my - a 21M file containing 100 concatenated copies of all the files in my
@ -489,18 +437,9 @@ While:
... seems to lose the fight, at the `readpo(LICENSES.fr.po)` step, ... seems to lose the fight, at the `readpo(LICENSES.fr.po)` step,
against some kind of infinite loop, deadlock, or any similar beast. against some kind of infinite loop, deadlock, or any similar beast.
It does not seem to eat memory, though.
Whatever format module is used does not change anything. This is thus The root of this bug lies in `Text::WrapI18N`, see above for
probably a bug in po4a's core or in a lib it depends on. possible solutions.
The sub `read`, in `TransTractor.pm`, seems to be a good debugging
starting point.
#### msgmerge
`msgmerge` is run in our `refreshpofiles` function. I did not manage
to crash it with `zzuf`.
gettext/po4a rough corners gettext/po4a rough corners
-------------------------- --------------------------
@ -529,7 +468,7 @@ Using the fix to
[[bugs/pagetitle_function_does_not_respect_meta_titles]] from [[bugs/pagetitle_function_does_not_respect_meta_titles]] from
[[intrigeri]]'s `meta` branch, the generated links' text is based on [[intrigeri]]'s `meta` branch, the generated links' text is based on
the page titles set with the [[meta|plugins/meta]] plugin. This has to the page titles set with the [[meta|plugins/meta]] plugin. This has to
be merged upstream, though. be merged into ikiwiki upstream, though.
Robustness tests Robustness tests
---------------- ----------------