Poder versus segurança

Eu tava lendo um post do cv que terminava com essa deixa…

Os usuários do UOL receberam um alerta essa semana contra o vírus Bugbear, que está pegando muitas máquinas por aí, inclusive empresas. Ouvi boatos sobre “115 países com empresas do setor financeiro” terem pego, etc, etc.

A JVM prevê um isolamento das aplicações em um sandbox, e bloqueios de segurança com permissões, evitando que código remoto (applet, webstart, ou uma app que vc baixe e rode) tenha acesso “demais” na sua máquina.

Mas se vc tiver aspectos, por exemplo, ou capacidade de modificar o bytecode em runtime (que o JDistro, o Echidna e vários outros progs fazem), vc pode passar por cima de muitas “garantias” previsas durante a criação das especificações.

A pergunta é: o que vcs acham mais importante, que os programas Java sejam poderosos, capazes de fazer maravilhas, ou seguros, de modo que possamos confiar sempre neles?

É possível construir um sistema incorruptível?

[]s

Vc não tem como burlar o modelo de segurança da JVM de um plugin
simplesmente pq não vai ter permissão para criar 1 classloader mais permissivo.

Segurança é um dos pilares do java e não tem como enfraquecer sem abrir 1 enorme rombo de segurança…

<ironia>

[quote=“louds”]… criar 1 classloader mais permissivo.
… não tem como enfraquecer sem abrir 1 enorme rombo de segurança…[/quote]

Mas e se fosse mais de UM ? talves dois ou tres…

// ...
String msg = &quot;blablaba 1 vez blabla e 1 programa balbla&quot;;
String betterMsg = msg.replaceAll&#40;&quot;1&quot;, &quot;um&quot;&#41;;
// ...

</ironia>

Rafael

tiago, ja mostraram que com aspectagem ou qualquer manipulador de bytecode como o jmangler e o bcel, voce quebra seguranca de QUALQUER software em java, mas nao quebra nada que foi loadado pelo bootstrap classloader, que eh a restricao basica do java.

mas realmente eh uma boa questao. mas o java ta muito bem sem dar permissoes grotescas pra todo mundo neh? e se voce quer fazer besteira, eh soh mexer nos pilicies :slight_smile:

Acho que eu to pensando meio longe…

Quando vc roda uma app em webstart, ela pode requerer permissões a mais pra vc. o Webstart checa o certificado, faz uma recomendação do tipo “recomendamos que vc não execute este programa” e depois pergunta: “Vc quer executá-lo”??

Claro que quando vc faz um projeto server side, vc pode proteger relativamente bem o servidor. Se for web, também é mais difícil. Mas e se for um sistema distribuído, com clientes em Java, usando RMI ou algo equivalente?

Em termos de arquitetura, não dá pra confiar nos clientes. Porque se o cara roda um cliente “envenenado”, ele pode burlar esquemas de segurança que estejam colocados do lado do cliente. Assim como é possível aspectar o Together pra pular a parte de licença, é possível mudar um cliente pra ignorar esquemas de segurança e avacalhar um sistema distribuído que era antes seguro.

Quando eu falo em poder, penso na possibilidade que um usuário teria de customizar ao máximo o comportamento do software que roda na máquina dele. O mundo do software livre também é o mundo dos clones.

O “pilar do Java” em termos de segurança é um código assim:

if &#40;&#40;name != null&#41; &amp;&amp; name.startsWith&#40;&quot;java.&quot;&#41;&#41; &#123;
            throw new SecurityException&#40;&quot;Prohibited package name&#58; &quot; + 
                                        name.substring&#40;0, name.lastIndexOf&#40;'.'&#41;&#41;&#41;;
        &#125;

dentro do defineClass(String name, byte[] b, int off, len, ProtectionDomain protectionDomain).

[]s