Como Controlar o Acesso A Seu Código?

16 respostas
pcalcado

Uma conversa na RIOJUG me fez pensar…

Imagine o cenário:

Eu tenho meu Gerenciador de Morcegos Cegos, uma aplicação… uhm… Swing com HSQLDB, algo bem simples. Porém, eu contratei o maior especialista em Morcegos Cegos do mundo, que cobrou da minha emrpesa US$500/hora para fazer a especificação dos processos internos.

Minha emrpesa é extremamente capitalista, egoísta e malvada, não quer ninguém usando meu código sem ser pela interface swing.

Passamos um ofuscador inteligentíssimo que converteu todas as estruturas internas para nomes inacreditavelmente incompreensíveis sem modificar os atributos públicos e eventual uso de reflection. Ok, eu pdoeria até ofuscar os públicos, mas isso ia prejudicar o exemplo, então vamos supôr que eu uso bastante reflection e não posso fazer isso.

O que exatamente impede o cliente de descobrir que meu POJO nomeado BatManagerJaponeis tem os métodos que eu uso para gerenciar meus cmorceguinhos? o que impede que ele instancie objetos Bat e passe apra ele numa aplicação feita pelo meu concorrente, a IBM - International Bat Machines?

Considerando que o sistema roda no cliente, a JVM é dele, o AS (se necessário for) também, minha aplicação é um bando de bytecode zipado em um arquivo com uma extensão engraçadinha (jar, war, ear, sar…whatevear)… oq eu impede dele reutilizar minha classe?

Eu sei que pensar nisso é densnecessário em 99% dos casos, mas existem casos que é necessário sim.

O que eu pensei é criar decorators/interceptors (usando AOP, manipulação de bytecode, martelo e pregos, sei lá) passando chaves criptográficas para as classes ao chamar um método… mas… cacete que trabalho felomenal!

Any idea?

Shoes

16 Respostas

J

Trabalhei em uma empresa que desenvolvia sistemas de controle de acessos e desenvolvemos uma DLL (era vb tá) que continha o protocolo de acesso desses equipamentos.
Não era uma coisa super-secreta mas deu um certo trampo e não queriamos que alguem pegasse essa DLL e usasse no seu sistema.
Como tudo em vb era gambiarra mesmo criamos mais uma.
A DLL tinha uma senha enorme para ser acessada.
Era uma coisa a fixa mesmo.
ex:

Rafael_Steil

Era algo fixo? E estava na DLL? Entao descobrir a senha era questao de… hhm… 47,6 segundos? :mrgreen:

Rafael

Rafael_Steil

Digamos que algo assim viesse a funcionar. Seguindo a logica de AOP, o cara poderia, da mesma forma, adicionar alguns pointcuts, modificar o classloader e afins, e desobrir boa parte da informacao… nao?!..

Entra aquela ditado: “Se alguem realmente quiser quebrar o seu sistema, ele vai conseguir”. Voce diminui a probabilidade / quantidade / frequencia disso ocorrer, mas ate que ponto daria para aceitar uma exigiencia assim da diretoria?

Rafael

J

Era lógico que esse “sistema de segurança” era uma bos***
Mas era uma senha enorme.
Se vc fizesse engenharia reversa da classe daria certo, mas é dificil.
Agora com esse super obfuscador do Shoes ficaria dificil
Mas se poderia usar algo mais profissional mas baseado em senhas.

pcalcado

Assinatura digital para minhas classes?

thingoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool! cade voce rapaz!

pcalcado

Eu concordo, mas encare a pergunta como um exercício, não como algo que aluém venha a fazer, uma torre de hanoi ou filosofos comendo macarrão :wink:

J

Cara depois desse CGLIB que o Hibernate usa qualquer controle fica em vão.
O negócio não muda os bytescodes em runtime ?
Então em java eu desencanei desse negócio de proteção…

T

É, tem um bocado de requisitos aqui :stuck_out_tongue:

Se fosse algo mais boboca (tipo aplicação Java com ou sem GUI, não preciso usar um servidor de aplicações, posso mandar um instalador gigantesco, gerar código nativo, e minha aplicação não precisa falar com ninguém) era só morrer com alguns dólares (US$ 750,00 ou mais) e comprar o tal compilador da Excelsior (Excelsior Jet 3.7, http://www.excelsior-usa.com/jet.html ).
Abrir código nativo em C++ já é trabalho para russos - lembre-se de quem prepara todos aqueles cracks - , imagine se você usar um compilador Java para código nativo…

Mas pelo que você pediu é meio complicado… Talvez dê para fazer um pouco de “damage control”. Que tal um bom advogado? :wink:

Mauricio_Linhares

Não se esqueça do JavaAssist:

http://www.jboss.com/products/javassist.html

Você “digita” o método e mete ele na classe :smiley:

Talvez uma solução fosse usar um factory que fizesse a instânciação de todas as classes. Todas elas seriam classes internas ao factory e teriam todos os construtores private, assim só a factory poderia criar um novo objeto.

Mas pro casa acessar essa factory ele deveria ter um “serial key” com uma chave aí, se ele não metese a chave, não funcionaria.

Sei lá, sempre tem um jeito de detonar isso, usando o JavaAssist era só escrever um:

public FactoryComCriptografia()

E meter ele lá dentro, mas o cara ia ter que saber né. Como o Rafael já disse, não dá :?

cv1

Todo codigo importante o suficiente para merecer protecao contra copia que atrapalha a vida de quem pagou por ele esta pedindo para ser substituido por uma alternativa opensource.

Todo codigo que prove um servico importante o suficiente para merecer protecao contra copia que nao atrapalha a vida de quem pagou por ele pode ser chamado na forma de um servico na web.

pcalcado

Acho que não me fiz entender.

Eu não pretendo usar uma possível (?) alternativa em um projeto, mesmo proque as emrpesas que eu trabalho e trabalhei geralmente vendem serviços, não caixas.

É apenas uma pergunta: alguém consegue imaginar um modo de fazer isso?

De qualquer modo, a ausência de um meio prático disso em Java depois de dez anos indica que como o cv pregou não existem mais espaços para aplicações rodando sem conexão com um servidor?

Os cracks já provaram que serial key não funciona, isso desde que eu tive meu primeiro PC e jogava Alone in the Dark, mas eu estou falando em coisa de programador, usar uma classe XYZ como componente third-party ilegalmente.

Existem empresas com sistemas Desktop 100% Java. Como elas estão fazendo?

Luca

Olá

Claro, um bom contrato e mais o seguinte:

1 - trava de hardware (já usei, funciona, mas dá um puta trabalho)

2 - ClassLoader zipada e com criptografia (Já usei em testes, funciona, mas pode ser aberto por alguém com acesso à um dump da memória)

3 - verificação de autorização/autenticação usado em conjunto com 1 e 2.

Qual eu adotaria? O custo da solução depende do preço do software. E 99% de segurança só com trava de hardware.

<editado>E é claro que o modelo ASP citado pelo CV é uma ótima alternativa.</editado>

[]s
Luca

cv1

Acho que o IntelliJ manda um “oi” pro site da JetBrains quando vc ativa o serial dele. Se aquele serial ja foi usado, voce recebe um e-mailzinho alguns dias depois.

Ele tambem manda umas mensagenzinhas na LAN - e se mais de um usuario pega a mesma licensa do IDEA, ele da uma mensagem e tranca ate um dos dois fechar o programa ou arrumar outra licensa.

Mauricio_Linhares

O Visual Studio tem esse negócio também, mas só o comportamento da LAN.

louds

Phillip, existem várias soluções pro teu problema.

Mas temos que levar o em consideração que não existe um sistema 100% seguro ou a prova de falhas. O esforço para proteger é proporcional a raiz quadrada do esforço pra quebrar.

Como qualquer aplicação real de segurança, não podemos usar uma métrica absoluta, mas uma relativa aos usuarios que você está esperando. Então vejamos, você espera que programadores com conhecimento muito avançado vão desejar utilizar a lib? Ou somente os funcionarios regulares dos teus clientes?

No caso de somente serem os funcionarios, um esquema envolvendo criptografia e chaves bem escondidas (ou geradas online) já resolve, senão vc pode ir pensando nas coisas mais cabeludas com mundo como usar processos separados, nunca trabalhar com memoria em aberto. Um truque bem simples que eu já vi fazerem é sortear 1 página de memoria read-only e fazer xor dela com tudo que você tira e põe da memoria.

O importante é saber que a oportunidade faz o bandido, então não precisa ser 100% seguro, basta ser dificil o suficiente para 99% dos usuarios desistirem, ou uma quantidade que justique o investimento.

T

Já postei aqui este link, mas nunca é demais saber como é que funciona uma fechadura de combinação. É interessante, porque saber como é que funciona a segurança no mundo físico é uma boa pista do que pode ser feito no mundo virtual. No mundo físico não existe a segurança 100%; porque é que ela deva existir no mundo virtual?
“Safecracking for the Computer Scientist” -

Safecracking for the computer scientist Matt Blaze ... Abstract This paper is a general survey of safe and vault security from a computer science perspective, with emphasis on the metrics used to evaluate these systems and the weaknesses that cause them to fail. We examine security against forced, covert and surreptitious safe opening, focusing on the mechanical combination locks most commonly used on commercial safes in the US. Our analysis contrasts the philosophy and tools of physical security with those of information security, especially where techniques might be profitably applied across these disciplines.
Criado 10 de junho de 2005
Ultima resposta 10 de jun. de 2005
Respostas 16
Participantes 8