[Cascavel-pm] Perl - Cases

Luis Motta Campos luismottacampos em yahoo.co.uk
Quarta Abril 25 00:38:57 PDT 2007


On Apr 24, 2007, at 8:08 PM, Thomas Britis wrote:
> Eden Cardim wrote:
> to do tamanho do bugzilla
>> - < use lib qw(.) > ao meu ver, está sendo usado para adaptar a
>> estrutura mal-definida (segundo os meus critérios individuais) do
>> código, que mistura bibliotecas (.pl = perl library) com executáveis
>> (.cgi). Se não me falha a memória, ter o diretório atual no @INC dá
>> vazão a falhas de segurança, tanto é que Perl não coloca o '.' no  
>> @INC
>> se o taint mode estiver ligado.
>
> 	Acredito que essa falha de segurança seria válida apenas se 'alguém'
> tivesse acesso de escrita ao diretório '.' de onde roda o CGI, já que,
> quando se faz um use lib qw(.), o diretório '.' passa a ser o primeiro
> da lista do @INC.

   Se você perguntar para o Bibliotecário Bêbado, vai descobrir que a  
lista de bugs do webserver que um dia foi popularmente conhecido como  
"remendinho" (a-patchy) – até que alguém criou vergonha na cara e  
trocou o nome sem chamar muito a atenção (apache) – é extensa e bem- 
documentada.

> Seria possível então utilizar um módulo 'mal' em favor
> de um módulo legítimo na estrutura normal do @INC. Porém, não sei  
> como o
> perl se comporta tendo dois módulos com o mesmo nome no @INC. Não  
> sei se
> ele usa o primeiro, o último, ou se não usa nenhum. A verdade é que,
> independente do que o perl fizer, ter permissão de escrita no  
> diretório
> em que o cgi está (ou programa qualquer) é uma falha além do que
> preconiza o @INC, pois o próprio cgi poderia ser alterado.
>
   O @INC é iterado pelo Perl para encontrar um módulo até que a  
primeira instância seja encontrada. Supondo então que você tenha algo  
assim:

   /usr/lib/perl5/A.pm (1)
   /usr/local/lib/perl5/A.pm (2)

   e o seu @INC seja qw( /usr/lib/perl5 /usr/local/lib/perl5 ),  
quando você disser "use A;", o perl vai procurar e encontrar (1).

   Caso seu @INC = qw( /usr/local/lib/perl5 /usr/lib/perl5 ), então  
"use A;" vai carregar (2).


> 	Tudo isso, claro, se não houver alguma outra falha de segurança  
> que eu
> não consegui enxergar.

   Não existe programa "sem" falhas de segurança. Mas existem muitas  
falhas de segurança que a gente não consegue enxergar...

   Se o cara conseguir se aproveitar de um "require" como este, e o  
webserver implementar HTTP FILE TRANSFER (os métodos de upload de  
arquivo do protocolo, que ninguém implementa por motivos óbvios),  
então alguém pode carregar código perl arbitrário para ser executado  
no lugar do seu "require" e isso é muito mau, e não pode ser  
considerado "falha de segurança" – todas as operações são lícitas,  
estavam previstas para serem utilizadas e o sistema quebrou mesmo assim.

   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão Cascavel-pm