O programador companheiro usou as piores práticas de programação


37

Eu sei que parece estranho dizer, mas um colega programador no trabalho usou deliberadamente algumas práticas ruins de programação de propósito! Eu vou explicar. Primeiro, deixe-me dizer que ele é um cara inteligente e, na maioria das vezes, escreve código inteligível.

Ele foi convidado a implementar o licenciamento em um projeto de aplicativo da Web escrito em Java. Já que é Java, se alguém realmente quisesse, provavelmente poderia abrir os jars e ler os nomes das classes e métodos escritos dentro. Sua solução para esse problema foi literalmente chamar variáveis ​​e métodos desajeitadamente nomes menos que óbvios e plantá-los em classes já congestionadas, em vez de gerar novas classes.

Sua justificativa era que, se um hacker quisesse mudar determinadas classes para ignorar as verificações de licenciamento (e, portanto, obter uma cópia gratuita do produto), teria muito mais dificuldade se não fosse óbvio quais métodos execute essas tarefas específicas. Somente depois que ele fez isso eu o confrontei, sugerindo que talvez pudéssemos comprar algum tipo de biblioteca ofuscante para fazer isso por nós, mantendo boas práticas de programação. Ele afirma não ter tido tempo ou recursos para procurar esse tipo de solução.

..Que me deixa em um dilema. Procuro uma biblioteca de ofuscação em Java e corrijo o código antigo (que pode ser um pouco delicado quanto à remodelação do código), ou deixo como está, tanto quanto isso me irrita sem fim?


4
Se sua pergunta é sobre como lidar com a política dessa situação, muitas das respostas aqui estão apontando na direção certa, mas se, como sugere um comentário seu, você quer realmente uma alternativa melhor para propor, você pode verificar respostas para fora para esta pergunta: stackoverflow.com/questions/6018215/...
Mark Booth

8
Se um hacker com acesso ao seu código-fonte limpo puder invadir sua autenticação, é possível que seja hackável. Nenhuma quantidade de ofuscação ajudará. Se você está atrás de uma solução que impede alguns hackers, além do ofuscamento, você também pode usar algumas de suas práticas de desvio de direção (oculte coisas em classes improváveis ​​que não podem ser facilmente substituídas). Atualizações frequentes que alteram completamente sua prática de autenticação também ajudam. Muitos usuários se cansam de confiar em hackers e apenas compram.
Bill K

2
Ele estava renomeando os habitantes locais? Nesse caso, ele está perdendo tempo - elas não existem como variáveis ​​nomeadas no código compilado.
Nick Johnson

11
É chamado de "ofuscação" e, embora esteja sendo usado com mais frequência hoje em dia, não é uma prova completa! .. embora atrase alguém de decifrar o código, ele pode ser decifrado! .. o que eu gostaria de ver é um compilador que pode criptografar o código do objeto e ser executado apenas com a chave correta, para que mesmo alguém com um editor de disco, desmontador ou qualquer outra ferramenta de cracking nunca consiga fazer cara ou coroa com ele!
Frank R.

6
"Sua solução para esse problema foi literalmente chamar variáveis ​​e métodos de nomes menos que óbvios e plantá-los em classes já congestionadas, em vez de gerar novas classes". e "Primeiro, deixe-me dizer que ele é um cara inteligente" não vai bem no mesmo parágrafo!
devorado elysium

Respostas:


94

Segurança através da ofuscação nunca é boa segurança. Deve haver maneiras melhores de proteger sua propriedade intelectual. E é isso que você e seu colega devem apresentar como uma preocupação conjunta com seu gerente. Se a gerência decidir que não quer gastar tempo ou dinheiro com segurança aprimorada, vocês dois terão que conviver com essa decisão (não é seu produto, é o produto da empresa) e é melhor não gastar (desperdiçar?) mais tempo sobre o assunto.


31
+1 Ofuscação NÃO é segurança, apenas um cobertor de conforto.
uɐɪ

7
Se você pode encontrar uma solução melhor do que a ofuscação, marcarei sua resposta como a correta. Como você pode garantir que alguém com acesso ao arquivo war não possa modificar sua funcionalidade pelo menos no que diz respeito às licenças?
Neil

5
Você não pode garantir isso quando alguém tiver acesso aos arquivos. Mas a verdade é: O mecanismo mais simples impede que 99,99% dos usuários causem danos ao seu software. Um hacker dedicado e qualificado SEMPRE encontrará uma maneira de contornar a segurança do aplicativo. No entanto, você pode alternar para a verificação remota, para que seu programa seja executado apenas quando autenticado em um serviço seu. Para que isso seja seguro, você precisa criptografar todo o seu programa e ter algum tipo de carregador de inicialização. MAS: se alguém tiver uma chave válida, ele poderá fazer engenharia reversa do software novamente de qualquer maneira.
Falcon

7
@ Neil: implemente a lógica de negócios principal em um microcontrolador conectado como um dongle USB. Você não disse que tinha que ser barato ou fácil de implementar;)
SF.

8
@SF.: Touche. Eu acho que deveria exigir três satélites para conectar simultaneamente também, apenas para o inferno. ;)
Neil

84

Original: O que seu chefe diz? Descubra - faça isso.


Me pediram para elaborar o acima:

Primeiro de tudo, acho que você tem mais de um dilema:

  • Você deve "consertar" o código de outra pessoa?
  • A implementação (daqui em diante A) das outras pessoas é ruim o suficiente para ser substituída por outra coisa?
  • Um ofuscador (daqui em diante B) será melhor para esse "licenciamento incorporado em nosso aplicativo"?

Em primeiro lugar, visto a partir de um caso de negócios o problema É resolvido. A está no lugar e é - provavelmente - uma solução "suficientemente boa" para o problema. Sua empresa pode estar feliz com isso basicamente protegida o suficiente para que um esforço deliberado seja necessário para quebrá-lo.

Isso significa que, mesmo que você não goste (e, acredite, verá muito pior ao longo de sua carreira ), ele faz o que é necessário. Portanto, como o problema está resolvido, você não deve "apenas fazê-lo", mas sim convencer a pessoa encarregada de atribuir seu trabalho que a longo prazoO preço dessa implementação será alto o suficiente para justificar uma reversão e escolher um ofuscador de estoque. Isso exigirá um pouco de preparação de você e observe também que os ofuscadores também têm desvantagens que você precisa saber (outras respostas cobrem isso muito bem). Por exemplo, rastreamentos de pilha não são imediatamente utilizáveis ​​etc. Tudo depende de quão importante é evitar a pirataria. Observe que o mais difícil de quebrar é aquele que exige dongles de hardware para executar e provavelmente é mais caro do que seus clientes gostariam.

Portanto, essa decisão não é sua, pois sua empresa precisa usar recursos adicionais para acessar B. Portanto, você precisa levar suas preocupações para a pessoa responsável, explicar essa e qualquer outra preocupação de longo prazo o suficiente para que ela entenda o motivo. você considera inferior à sua sugestão. Em seguida, deixe-o tomar a decisão e, independentemente do que seja, respeite -o e se comporte de maneira profissional. Observe que o autor original provavelmente terá que mantê-lo assim mesmo como ele o escreveu e, se ele for embora ou não quiser mais, você poderá abordar o assunto novamente.

Em outras palavras: O que seu chefe diz? Descubra - faça isso.

Observe também que isso teria sido diferente se você tivesse levantado a questão anteriormente, para que o dinheiro desperdiçado pelo tempo gasto na implementação de A fosse menor. Em outras palavras, quando a escolha entre A e B deveria ser feita.

Finalmente, gostaria de comentar sua pergunta sobre "apenas consertar o código de outras pessoas". Esta não é uma pequena correção para o código existente (que eu acho bom e incentivado, especialmente com testes em vigor). É uma reversão e reimplementação disruptivas e, mesmo em equipes com propriedade de código comum, isso não seria algo aceitável - pelo menos para mim - sem aprovação prévia.

Espero que isso esclareça meu ponto de vista.


8
Meu chefe não é programador e provavelmente teria dificuldade em explicar por que devemos investir tempo e dinheiro em algo que, em última análise, não modifica o comportamento do programa.
Neil

15
@ Neil: ... então talvez seja hora de apresentar ao seu chefe o conceito de "custos de manutenção"?
SF.

21
Isso se tornará a resposta padrão para todas as perguntas sobre colegas de trabalho ou o ambiente de trabalho? Eu sei que alguns nub tiveram que pedir para você postar isso como resposta, mas vamos lá, não é uma resposta. Na verdade, essa é uma pergunta semi-decente (ainda que sem jeito) sobre os problemas de segurança através da obscuridade; essa "resposta" é um insulto.
Aaronaught

8
@Aaronaught. Essa resposta chega aos ossos quando é "a implementação A é ruim, sugiro que façamos a implementação B" porque é necessário fazer um trabalho adicional (igual a dinheiro). Se fosse uma escolha entre implementar A ou B, a resposta teria sido diferente. Sugiro que você abra uma pergunta no meta se quiser uma resposta mais detalhada.

22
"Isso se tornará a resposta padrão para todas as perguntas sobre colegas de trabalho ou o ambiente de trabalho?" Por que não? Se essa foi uma pergunta técnica. Todos "Devo consertar isso nas costas dos meus colegas de trabalho?" questões em última análise, se resumem a "Não, trazê-lo para a atenção da equipe de energia / superior"
Binary Worrier

13

Procuro uma biblioteca de ofuscação em Java e corrijo o código antigo (que pode ser um pouco delicado quanto à remodelação do código), ou deixo como está, tanto quanto isso me irrita sem fim?

Não , voltar atrás de alguém e alterar o código pelo qual ele é responsável seria uma ofensa pior do que escrever o código questionável para começar.

Você falou com o programador, seu próximo passo é manter o nariz fora dele ou falar com a gerência e depois manter o nariz fora dele.


Então, quando eu pescar nessas aulas no futuro, eu segurarei meu nariz, eu acho.
Neil

3
Quando você tem uma responsabilidade direta por esse código, alterá-lo ao seu gosto é bom, mas se houver uma responsabilidade conjunta, você precisará de alguém para arbitrar. É fácil prejudicar as relações de trabalho e perder tempo em situações como essa; é melhor não fazer disso um problema, se possível. Se um problema precisar ser feito, saia do caminho o mais rápido possível.
DKnight

6

Houve algum tipo de revisão oficial de código - ou houve o confronto com uma "revisão de código" não oficial? Eu diria que, como esse é um assunto delicado e importante, como segurança e licenciamento, você precisa elevar isso à cadeia. Você fez a primeira parte - confrontando o programador. No entanto, agora que ele não está ouvindo, você pode / deve aceitar. Caso contrário, você pode fazer parte do problema.

Eu diria a ele que você vai fazer isso - isso pode mudar de idéia. Caso contrário, escreva um e-mail muito politicamente correto, porém preciso e conciso sobre a situação ao seu chefe e faça o CC do programador. No email, solicite uma reunião entre vocês três e / ou qualquer outra parte participante.

Sempre encontre essas coisas de frente - mas de maneira política e amigável.


Certamente uma abordagem louvável. Percebi a modificação do código, atualizando meu código do SVN. Embora haja chances, se ele não concordar, convencer meu chefe a tomar essas precauções de segurança provavelmente não resultará em nenhuma alteração, pois o programador pode argumentar que já 'funciona'.
Neil

2

Se você puder encontrar um ofuscador que ofusque a assinatura de classes (nomes de métodos etc.), proponha comprar e usá-lo.

Até lá, talvez você precise viver com isso. Admito que fiz algo semelhante em um projeto recente do Grails - as verificações de licença são deliberadamente incorporadas no método de login já grande, portanto seria muito difícil substituir o método para ignorar a verificação.


11
Eu não posso te dizer o quanto isso me incomoda, embora você provavelmente esteja certo que eu vou ter que viver com isso.
Neil

2

Ele pode demonstrar que tal invasão é possível, ou é apenas um cenário hipotético com o qual ele está meio preocupado? Ele pode dar uma demonstração ao vivo desse trabalho? Ele deveria tentar. A sério. Se funcionar, deve ser apresentado à gerência e sugerir a obtenção de um ofuscador.

Se um ofuscador não é seguro o suficiente, você já procurou outras maneiras de proteger o JAR, talvez algo como criptografá-lo ou compilá-lo no código nativo?

RE: reformulando seu código: é apenas uma questão de renomear? Muitos IDEs possuem ferramentas de refatoração que podem fazer isso facilmente.


Ele me parece um pouco paranóico, embora eu possa entender o porquê. Se o produto fosse hackeado, provavelmente significaria o trabalho dele. Não direi que é possível, mas sei o suficiente para saber como você pode procurar por nomes de métodos e, se houvesse um método óbvio chamado "isLicenseValid", seria uma questão de escrever uma classe que possua esse método e sempre retorne fiel a 'hackear'. Eu acho que esse programa é complicado o suficiente sem complicar ainda mais, embora ele pareça querer ter certeza disso. Acho que poderia consertar o código dele facilmente, renomeando-o, sim.
Neil

Só porque você tem um método chamado "isLicenseValid" não significa que ele pode ser invadido simplesmente escrevendo uma classe com o mesmo método. Se você marcar sua classe como "selada" (essa é a sintaxe do C #), os terceiros não poderão contornar suas verificações de segurança escrevendo subclasses e substituindo seu método. De qualquer forma, a menos que esse cara seja o oficial de segurança da empresa, por que isso significaria seu trabalho se o produto fosse hackeado?
Tundey 5/07

2
@ Tundey, não é uma questão de subclasses (como elas seriam carregadas?): É uma questão de escrever a mesma classe e colocar a versão invadida anteriormente na lista de pesquisa do caminho de classe.
22411 Peter

11
ha.Lembro-me das alegrias do carregamento de classes em Java. Ainda deve haver uma maneira melhor de mitigar isso. Na verdade, se seu carregador de classes não estiver comprometido, como alguém pode escrever uma classe igual à sua? Especialmente se o seu JAR estiver assinado? Não assinar seus JARs e selar suas aulas resolveria o problema de alguém escrever uma classe com o mesmo nome que o seu?
Tundey 5/07

11
@ Como o Sun JVM é (principalmente) de código aberto, você pode modificá-lo.
Spudd86

2

Independentemente do valor do seu IP, o mais inteligente é não alterar o seu código na esperança de confundir hackers. Além do fato de que será um pesadelo continuar seguindo em frente, isso realmente não resolve nenhum problema. Isso apenas torna mais difícil, mas não impossível. Portanto, não é realmente uma solução e os efeitos colaterais são ruins. É como tomar remédio que não funciona e tem efeitos colaterais ruins.

Seu problema é como proteger seu IP. Encontre uma solução para isso: ofuscadores, servidor de licenças etc.


Eu concordo com você 110%. No que diz respeito à proteção do IP, é uma salvaguarda para o nosso cliente, pois é a máquina deles que executa o aplicativo da Web, não a nossa, embora você faça um argumento válido. Eu estava mais preocupado com o cliente que tem acesso direto ao nosso produto em sua máquina e pode separá-lo. Um servidor de licenças é tão bom quanto a segurança do cliente. Se você pode ignorar o acesso ao servidor de licenças, nenhum truque no livro o impedirá de usar o programa sem licença.
Neil

1

Encontrei um problema semelhante quando outro desenvolvedor nomeou nossas rotinas de criptografia / descriptografia str__copye str__delete(observe o segundo sublinhado). Como era ruim e poderia ter sido melhor, esperamos até que houvesse uma história em que a atualização do licenciamento fosse necessária. A gerência não teve problemas com algumas horas extras, porque a descrevemos como "limpeza, para a próxima vez em que licenciarmos, levará menos tempo e será mais seguro". Problema resolvido, sem sentimentos feridos.


Bem, é claro que sempre podemos mudar isso mais tarde, embora eu ache que a mudança precisa estar na cabeça mais do que no código.
Neil

11
@ Neil Então eu sugiro que você é o único que precisa da mudança na cabeça. Se o código funcionar, tiver testes adequados e for bem comentado seguir esse caminho, em vez de usar o ofuscador, não é a melhor opção, mas também não é o fim do mundo. Corrija-o mais tarde se houver algum problema e siga em frente.
Christopher Bibbs

@Christopher_Bibbs: Coloque sua mente à vontade. Eu quase certamente posso garantir que, de fato, isso apresentará um problema.
Neil

1

Meu primeiro pensamento foi a manutenção desse código. Se o código já está ofuscado e ele seguiu em frente, boa sorte tentando entender o código. Você será o hacker tentando decifrar o código.

Em vez disso, eu recomendaria limpar o código e usar um ofuscador para fazer todo o trabalho duro. A longo prazo, você terá muito código gerenciável e deixará toda a complexidade louca para quem quiser invadir sua licença.

Lembre-se de que nenhum ofuscador é perfeito, e um hacker muito determinado pode fazer engenharia reversa de qualquer coisa, mas pelo menos será apenas ele. Além disso, os ofuscadores acrescentam muito mais complexidade do que aquele sujeito provavelmente pode.


0

Eu concordo plenamente com as respostas que você deve perguntar ao seu chefe sobre o assunto e fazer o que ele diz.

No entanto, um adendo muito importante a essas respostas é que você deve documentar suas preocupações sobre segurança e manutenção. Independentemente de você alterar ou não o código, é importante que as pessoas saibam com o que você está preocupado e por quê. Isso é importante tanto proativamente (seu chefe não pode tomar uma decisão que ele nem sabe que precisa ser tomada) quanto defensivamente (se / quando um hacker faz buracos no sistema de licenciamento mal protegido, eles não podem culpá-lo por sua erro.)


0

"Não seja o profissional mais superior a saber de um problema".

Em outras palavras, diga ao seu chefe e vá de lá. Se você ficar quieto e for o topo do pólo totum desse segredo, quando o empurrão chegar, você será responsável. Diga ao seu chefe de passagem e deixe-o decidir sobre uma maneira de abordá-lo. Dessa forma, você é aliviado do fardo da escolha.

Não basta dizer ao seu chefe, porque muitos gerentes talvez não sejam tão técnicos, mas faça o que sempre fazemos: forneça o problema e as possíveis soluções com as vantagens / desvantagens de cada uma dessas soluções. Então deixe que eles decidam e que isso tenha passado. É por isso que os gerentes / líderes recebem muito dinheiro!


0

A pura verdade é que, com tempo e recursos suficientes, tudo pode ser quebrado. É uma função simples de quão popular é seu aplicativo. Quanto mais popular, mais hackers habilidosos atraem e mais tempo é dedicado a quebrá-lo. A ofuscação de código fornece exatamente isso - um meio de aumentar o tempo necessário para quebrá-lo, semelhante à criptografia. Portanto, se seu código é ofuscado, é necessário que o invasor seja habilidoso e dedique tempo a ele, caso contrário ele se desesperará e desistirá. Você deve se perguntar se seu aplicativo vale a pena nos dois lados.

É realmente incrível o quão difícil pode ser decifrar código ofuscado. Você pode facilmente transformar um programa simples de 10 linhas C em um conjunto de 100 linhas, através da ofuscação. Se você tentar depurá-lo, você pulará sem sentido no código e poderá ser realmente frustrante passar por ele. Eventualmente, ele quebrará, mas se tornará realmente difícil e, como nada é realmente impossível, esse é o ponto. A ofuscação de código reduz o número de pessoas capazes de quebrá-la.

Claro que existem maneiras melhores, como tentar confundir o depurador e não o cracker, mas este é barato e eficiente. No entanto, nomear as coisas de maneira desajeitada não é suficiente. Você precisa alterar as funções de chamada de fluxo de controle que realmente não fazem nada para o seu código geral, mas aumentam o tamanho e a complexidade dele: chamam funções falsas cujo valor de retorno não é usado em nenhum lugar, a partir de funções internas que realmente fazem alguma coisa. Você já pode ver como isso pode ficar realmente confuso.

Você tem algo que o atacante não tem. O código fonte original. Encontre uma maneira de organizar melhor para si mesmo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.