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?
Respostas:
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.
fonte
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:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Encontrei um problema semelhante quando outro desenvolvedor nomeou nossas rotinas de criptografia / descriptografia
str__copy
estr__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.fonte
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.
fonte
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.)
fonte
"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!
fonte
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.
fonte