Bug com CFFTP e sandbox security?

Não sou de ficar caçando agulha em palheiro mas hoje acredito ter encontrado um segundo bug no CFMX 6.1 (o primeiro pode ser visto aqui). Desta vez foi tentando encontrar a solução para um problema levantado por um cliente da MM Brasil (provavelmente o mesmo que postou uma mensagem sobre isso na CF-Brasil em setembro deste ano). Parece que a tag CFFTP (com seus atributos padrões) não funciona corretamente e numa pasta “sandboxizada” (seria melhor usar “contextualizada”?).

Sou um completo ignorante em RFCs, protocolos e afins, por isso me perdoem os puristas sobre o que vou falar sobre o protocolo FTP… Quando nos conectados a um servidor FTP usando a tag CFFTP, o ColdFusionMX (devemos encarar o ColdFusionMX/CFFTP como “clientes” FTP) usa – por padrão (?) – o modo PORT para se conectar ao host FTP solicitado. Desta maneira o tráfego de informações ficará “travado”, no lado do servidor FTP, somente nas portas 21 (cmd) e 20 (data). Qualquer um que já tenha configurado um firewall ou mesmo um cliente FTP já se deparou com esse comportamento (que na verdade é uma regra).

O cerne da questão é que, apesar de ter todas as permissões corretas e configuradas na seção “Server/Ports” de uma sandbox security, o CFMX não consegue completar a conexão, retornando um erro de java.net.SocketPermission denied, tal como reportado.

Mesmo quando não existe qualquer restrição de host/ips e portas no “Server/Ports” (default quando você configura uma nova sandbox) o CFMX é incapaz de se conectar via FTP em modo default (port). “Googlei” para todo o lado procurando alguém que tenha encontrado o mesmo problema mas só encontrei um relato semelhante, até agora sem resposta.

Estaria eu viajando de bonde ou trata-se realmente de um bug?

O workaround que encontrei para o problema é o seguinte:

1) No seu script CFML, use o atributo passive=”Yes” da tag CFFTP;
2) Prefira não configurar restrições dentro de “Server/Ports”. Caso isso seja imprescindível e inevitável, esta deverá conter as seguintes entradas: (1) “localhost:(todas as portas – basta deixar o campo “port” em branco)”, (2) “ftp.uol.com.br:21” (ou qq. outro host ftp), (3) “ftp.uol.com.br:1024-65535” (range dinâmico para retorno de conexões FTP em modo passive).

Veja no link continue lendo abaixo a mensagem que enviei à Macromedia (bug form) sobre o assunto.

Alguém aí consegue reproduzir o dito cujo?

UPDATE: A Macromedia Inc confirma o bug e este foi adicionado ao bug base sob o número 54053.


MENSAGEM À MM:

I’m not sure but I think I’ve found a bug in the CFMX 6.1. The problem happens when you use CFFTP tag in a sandboxed folder. As you may know CFFTP uses PORT mode by default (the “passive” attribute is set to “no”). So far so good except for the fact that CFMX is not dealing the connection and it’s returning a java.net.SocketPermission error that follows:

Security: The requested template has been denied access to localhost:1024-. The following is the internal exception message: access denied (java.net.SocketPermission localhost:1024- listen,resolve).

I’ve tried to add 1024 (and higher) TCP port in the “Server/Port” settings but it doesn’t change anything. I’ve also added all possible weirdness as TCP ports (20, 21, various ranges etc, etc) with no sucess. The tag (in it’s defaults) doesn’t work under a default sandbox context (with all IP/Ports open and availble for connection).

The only workaround for it is to use passive mode (passive=”yes”) and (if you’re restricting access to “Server/Ports”) add the FTP host wide opened (leaving the “port” field blank) or add two entries (1) ftp.somehost.com:21 and (2) ftp.somehost.com:1024- (1024 and higher).

To exemplify:

1) http://www.alexhubner.com/ftp_port/ (using the default port mode)
2) http://www.alexhubner.com/ftp_pasv/ (using pasv mode)

And if my FTP server (or even the firewall ahead of it) doesn’t allow me to use PASV mode? Did you noticed a similar issue? I’ve googled around and didn’t found any mention to it. Can Macromedia provide a TechNote and a hotfix to it?

Many thanks!
Alex Hübner


5 Comments on “Bug com CFFTP e sandbox security?”

  1. Sem contar esse outro bug (o de instalação) aqui:
    http://www.cfgigolo.com/archives/000212.html

  2. Alex Hubner disse:

    Ah sim! É verdade! Esse é mais casca grossa ainda…

    O zé roela, e aí? conseguiste reproduzir o erro?

  3. Mesmo problema por aqui!

    O curioso é que nem colocando a linha (que já existe de forma similar no jrun.policy e no java.policy) abaixo no coldfusion.policy funciona:

    permission java.net.SocketPermission “localhost:1024-“,”listen,resolve,connect,accept”;

    … idéias?

  4. Eu já saquei dois outros BUGs.
    Um se refere ao site-wide template error handler, que carrega corretamente em um domínio, mas não em um sub… por exemplo, se der um erro em
    http://www.seusite.com.br/pagina.cfm
    ele roda na boa. mas… se rolar erro em:
    http://qqcoisa.seusite.com.br/pagina.cfm
    necas.

    outro “erro” é você deletar as páginas de um diretório, mas elas continuarem existindo por estarem compiladas e salvas em disco. O CF não confere se a página ainda existe, e continua executando, mesmo a dita cuja não existindo mais…

    Não utilizo a CFFTP, e portanto nunca me deparei com isso, mas valeu a dica e o aviso, Hübner!

    [ ]’s !

  5. Stan disse:

    Definindo melhor o problema:

    A especificação TCP para o protocolo FTP usa as portas 20 e 21 somente para entrada e uma porta pública qualquer (acima de 1023) para saída, ou seja, quando vc executa um open connection sua maquina usa uma porta pública qualquer mas aponta para a porta 21 do servidor. O mesmo acontece do lado do servidor, ele responde por uma porta pública apontando para a 21 de sua máquina.

    Poderia haver problema se não houvesse permissão de uso das portas públicas para a saída do servidor já que as portas 20 e 21 estão liberadas. Mas parece que não é esse o caso já que o erro indica que não houve permissão de acesso.

    Só me resta concluir que a “contextualização” da pasta exige uma autenticação de usuário diferente da feita pela tag CFFTP.

    Eu acredito que vc esteja passando pelo servidor e quem não permite a conexão é a contextualização.

    Espero ter contribuido….

    Abraços