Un autre programmeur a utilisé les pires pratiques de programmation

37

Je sais que cela semble étrange, mais un collègue programmeur au travail a délibérément utilisé deux mauvaises pratiques de programmation! Je vais t'expliquer. Permettez-moi d'abord de dire qu'il est un gars intelligent et que, pour la plupart, il écrit du code intelligible.

Il a été invité à mettre en place une licence pour un projet d’application Web écrit en Java. Comme il s’agit de Java, si on le voulait vraiment, on pourrait probablement pirater les fichiers jar et lire les noms des classes et des méthodes écrites à l’intérieur. Sa solution à ce problème consistait à appeler littéralement et maladroitement des variables et des méthodes moins évidentes que des noms évidents et à les planter dans des classes déjà encombrées plutôt que de générer de nouvelles classes.

Sa justification était que si un pirate informatique voulait changer certaines classes afin de contourner les vérifications de licence (et donc obtenir une copie gratuite du produit), il aurait beaucoup plus de mal à le faire s'il ne savait pas exactement quelles méthodes effectuer ces tâches particulières. Après l'avoir fait, je l'ai confronté à ce sujet, suggérant que nous pourrions peut-être acheter une sorte de bibliothèque d'obscurcissement pour le faire pour nous, tout en maintenant de bonnes pratiques de programmation. Il affirme ne pas avoir eu le temps ni les ressources nécessaires pour rechercher ce type de solution.

..Qui me laisse à un dilemme. Est-ce que je cherche une bibliothèque d'obscurcisseur en Java et répare son ancien code (ce qui peut être un peu délicat pour le remodeler), ou est-ce que je le laisse comme ça, autant que cela me contrarie sans fin?

Neil
la source
4
Si votre question porte sur la manière de gérer la politique de cette situation, de nombreuses réponses vont dans la bonne direction, mais si, comme le suggère votre commentaire, vous souhaitez réellement proposer une meilleure alternative, vous pouvez vérifier sur les réponses à cette question: stackoverflow.com/questions/6018215/…
Mark Booth
8
Si un pirate informatique ayant accès à votre code source propre peut pirater votre authentification, alors c'est hackable, point à la ligne. Aucune quantité d'obscurcissement ne vous aidera. Si vous recherchez une solution qui arrête certains pirates, vous pouvez également utiliser certaines de ses pratiques de mauvaise direction (masquer les éléments dans des classes improbables qui ne peuvent pas être facilement remplacées). Des mises à jour fréquentes qui changent complètement votre pratique d’authentification vous aident également. De nombreux utilisateurs se lassent de compter sur des pirates informatiques et l'achètent tout simplement.
Bill K
2
A-t-il renommé les habitants? Si c'est le cas, il perd son temps - de toute façon, elles n'existent pas en tant que variables nommées dans le code compilé.
Nick Johnson
1
Cela s'appelle "obscurcissement" et bien qu'il soit de plus en plus utilisé de nos jours, ce n'est pas une preuve à 100%! .. même s'il va retarder quelqu'un à déchiffrer le code, il peut être craqué! .. ce que j'aimerais voir, c'est un compilateur cela peut chiffrer le code objet et ne peut être exécuté qu'avec la clé correcte, de sorte que même une personne disposant d'un éditeur de disque, d'un désassembleur ou de tout autre outil de cracking ne pourra jamais en faire des têtes ou des queues!
Frank R.
6
"Sa solution à ce problème consistait à appeler littéralement et maladroitement des variables et des méthodes moins évidentes que des noms évidents, et à les insérer dans des classes déjà encombrées plutôt que de générer de nouvelles classes." et "Permettez-moi d’abord de dire qu’il est un gars intelligent" ne va pas bien dans le même paragraphe!
dévoré elysium

Réponses:

94

La sécurité par obfuscation n'est jamais une bonne sécurité. Il doit y avoir de meilleurs moyens de protéger votre propriété intellectuelle. Et c’est ce que vous et votre collègue devriez évoquer comme une préoccupation commune avec votre responsable. Si ensuite la direction décide qu'elle ne veut pas dépenser son temps ni son argent pour améliorer la sécurité, vous devrez alors tous les deux vivre avec cette décision (ce n'est pas votre produit, c'est le produit de l'entreprise) et mieux ne pas dépenser (gaspillage?) plus de temps sur le sujet.

Wolfgangsz
la source
31
+1 L'obscurcissement n'est PAS une sécurité, mais une couverture confortable.
Uu
7
Si vous pouvez trouver une meilleure solution que l’obscurcissement, je marquerai votre réponse comme la bonne. Comment pouvez-vous garantir qu'une personne ayant accès au fichier war ne pourra pas en modifier les fonctionnalités au moins en ce qui concerne les licences?
Neil
5
Vous ne pouvez pas le garantir du tout lorsque quelqu'un a accès aux fichiers. Mais la vérité est la suivante: le mécanisme le plus simple empêche 99,99% des utilisateurs de nuire à votre logiciel. Un pirate informatique expérimenté et dédié trouvera TOUJOURS un moyen de contourner la sécurité des applications. Vous pouvez toutefois passer à la vérification à distance afin que votre programme ne s'exécute que lorsqu'il est authentifié auprès de l'un de vos services. Pour que cela soit sécurisé, vous devez chiffrer l’ensemble de votre programme et disposer d’une sorte de chargeur de démarrage. MAIS: si quelqu'un a une clé valide, il peut quand même procéder au reverse engineering du logiciel.
Falcon
7
@Neil: implémentez la logique métier de base dans un microcontrôleur connecté en tant que clé USB. Vous n'avez pas dit que cela doit être bon marché ou facile à mettre en œuvre;)
SF.
8
@SF.: Touche. Je pense que trois satellites doivent également être connectés simultanément, juste pour le plaisir. ;)
Neil
84

Original: Que dit votre patron? Découvrez - faites cela.


On m'a demandé d'élaborer ce qui précède:

Tout d'abord, je pense que vous avez plus d'un dilemme:

  • Devez-vous "réparer" le code d'une autre personne?
  • La mise en œuvre (ici A) des autres personnes est-elle assez mauvaise pour être remplacée par quelque chose d'autre?
  • Un obfuscateur (ci-après B) sera-t-il meilleur pour cette "licence intégrée dans notre application"?

Tout d’abord, vu d’une analyse de rentabilisation, le problème est résolu. A est en place et constitue - très probablement - une solution "suffisante" au problème. Votre entreprise peut en être satisfaite en principe juste assez protégée pour qu’un effort délibéré soit nécessaire pour la résoudre.

Cela signifie que même si vous n'aimez pas cela (et croyez-moi, votre carrière sera bien pire ), il fait ce qu'il faut. Par conséquent, dès lors que le problème est résolu, vous ne devez pas simplement "le faire", mais plutôt convaincre la personne en charge de l'attribution de votre travail que le long termeLe prix de cette implémentation sera suffisamment élevé pour justifier un retour en arrière et le choix d’un obfuscateur d’actions. Cela nécessitera un peu de préparation de votre part et notez également que les obfuscateurs ont aussi des inconvénients que vous devez savoir (d'autres réponses couvrent bien ce problème). Par exemple, les traces de pile ne sont pas immédiatement utilisables, etc. Tout dépend de l'importance d'éviter le piratage. Notez que le plus difficile à résoudre est celui qui nécessite le fonctionnement de dongles matériels et est probablement plus coûteux que vos clients l’aimeront.

Par conséquent, cette décision n’appartient pas à vous, car votre entreprise doit utiliser des ressources supplémentaires pour accéder au point B. Par conséquent, vous devez faire part de vos préoccupations à la personne responsable, expliquez-la ainsi que toute autre préoccupation à long terme suffisamment pour lui permettre de comprendre pourquoi. vous le considérez inférieur à votre suggestion. Laissez-le ensuite prendre la décision et, quoi qu’il en soit, respectez -la et agissez en conséquence de manière professionnelle. Notez que l'auteur original devra très probablement le conserver comme il l'a écrit. S'il quitte ou ne veut plus le faire, vous pourrez à nouveau en parler.

En d'autres termes: que dit votre patron? Découvrez - faites cela.

Notez également que cela aurait été différent si vous aviez soulevé la question plus tôt, de sorte que le gaspillage d’argent pour le temps consacré à la mise en œuvre de A était réduit. En d'autres termes, lorsque le choix entre A et B devait être fait.

Enfin, je voudrais commenter votre question sur "corriger simplement le code des autres peuples". Ce n'est pas une petite solution au code existant (ce que je trouve très bien et qui est encouragé, en particulier avec les tests en place). Il s'agit d'un retour en arrière et d'une réimplémentation perturbants, et même dans les équipes avec la même propriété de code, cela ne serait pas une chose acceptable à faire - du moins pour moi - sans approbation préalable.

J'espère que cela clarifie mon point de vue.


la source
8
Mon patron n’est pas un programmeur et j’aurais probablement de la difficulté à expliquer pourquoi nous devrions investir temps et argent dans des activités qui ne modifieront en rien le comportement du programme.
Neil
15
@Neil: ... alors peut-être qu'il est temps de présenter à votre patron le concept de "coûts de maintenance"?
SF.
21
Est-ce que cela va devenir la réponse par défaut à chaque question sur les collègues ou l'environnement de travail? Je sais que certains membres du personnel ont dû aller vous dire de poster ceci comme réponse, mais allez, ce n'est pas une réponse. Il s’agit en fait d’une question plutôt décente (bien que maladroite) sur les problèmes de sécurité à travers l’obscurité; cette "réponse" est insultante.
Aaronaught
8
@ Aaronaught. Cette réponse est parfaitement rationnelle quand «la mise en œuvre A est mauvaise, je suggère que nous fassions la mise en œuvre B» car un travail supplémentaire (équivalent en argent) doit être effectué. Si c'était un choix entre implémenter A ou B, la réponse aurait été différente. Je vous suggère d’ouvrir une question sur la méta si vous souhaitez une réponse plus détaillée.
22
"Est-ce que cela va devenir la réponse par défaut à toutes les questions sur les collègues ou l'environnement de travail?" Pourquoi pas? Si ceci était formulé comme une question technique, par exemple "Quel est le meilleur? La commande codée à la main (= mauvaise pratique) est meilleure", alors c’est une question tout à fait différente et qui mérite une discussion technique. Tous "Devrais-je résoudre ce problème derrière mes collègues?" les questions se résument finalement à "Non, portez-le à l'attention de l'équipe / puissance supérieure"
Binary Worrier
13

Est-ce que je cherche une bibliothèque d'obscurcisseur en Java et répare son ancien code (ce qui peut être un peu délicat pour le remodeler), ou est-ce que je le laisse comme ça, autant que cela me contrarie sans fin?

Non , revenir en arrière et modifier le code dont ils sont responsables serait une infraction pire que de rédiger un code douteux.

Vous en avez parlé au programmeur, votre prochaine étape consiste à ne pas vous mêler de rien ou à en discuter avec la direction, puis à ne pas vous mêler de rien.

DKnight
la source
Ensuite, lorsque je suivrai ces cours à l'avenir, je me tiendrai le nez, je suppose.
Neil
3
Lorsque vous avez une responsabilité directe pour ce code, il vous suffit de le modifier à votre goût, mais s'il y a une responsabilité conjointe, vous aurez besoin d'un arbitre. Il est facile de nuire aux relations de travail et de perdre du temps sur de telles situations, il vaut mieux ne pas en parler si possible. Si un problème doit être résolu, résolvez-le dès que possible.
DKnight
6

Y a-t-il eu une révision de code officielle de quelque nature que ce soit - ou la confrontation a-t-elle eu pour résultat une "révision de code" non officielle? Je dirais que puisqu'il s'agit d'un sujet délicat et important tel que la sécurité et les licences, vous devez en parler plus haut dans la chaîne. Vous avez terminé la première partie - confronter le programmeur. Cependant, maintenant qu'il n'écoute pas, vous pouvez / devriez le reprendre. Si vous ne le faites pas, vous pouvez faire partie du problème.

Je lui dirais que vous allez le faire - cela PEUT changer d’avis. Si ce n'est pas le cas, écrivez à votre patron, et au programmeur CC, un courrier électronique très correct, à la fois précis et concis, sur la situation. Dans le courrier électronique, demandez une réunion entre vous trois et / ou toute autre partie participante.

Rencontrez toujours ces choses de front - mais d’une manière politique et amicale.

Catchops
la source
Certainement une approche louable. J'ai moi-même remarqué la modification du code, mettant à jour mon code à partir de SVN. Même s'il a des chances, s'il n'est pas d'accord, convaincre mon patron de prendre ces mesures de sécurité n'entraînera vraisemblablement aucun changement, car le programmeur pourrait affirmer que cela fonctionne déjà.
Neil
2

Si vous pouvez trouver un obscurcisseur capable d’obscurcir la signature de classes (noms de méthodes, etc.), alors proposez-vous de l’acheter et de l’utiliser.

Jusque-là, vous devrez peut-être vivre avec. J'avoue avoir fait quelque chose de similaire dans un projet Grails récent: les contrôles de licence sont délibérément intégrés à la méthode de connexion déjà très volumineuse. Il serait donc assez difficile de remplacer la méthode pour contourner le contrôle.

utilisateur281377
la source
1
Je ne peux pas vous dire à quel point cela me dérange, même si vous avez probablement raison de dire que je devrai vivre avec.
Neil
2

Peut-il démontrer qu'un tel piratage est réalisable, ou s'agit-il simplement d'un scénario hypothétique qui le préoccupe un peu? Peut-il donner une démonstration en direct de ce travail? Il devrait essayer. Sérieusement. Si cela fonctionne, il devrait être présenté à la direction, puis suggérer de se faire assombrir.

Si un obfuscateur n'est pas assez sécurisé, avez-vous envisagé d'autres moyens de sécuriser le fichier JAR, par exemple en le cryptant ou en le compilant en code natif?

RE: retravailler son code: Est-ce juste une question de renommer? De nombreux IDE ont des outils de refactoring qui peuvent le faire assez facilement.

FrustratedWithFormsDesigner
la source
Il me semble un peu paranoïaque, bien que je puisse comprendre pourquoi. Si le produit était piraté, cela signifierait probablement son travail. Je ne dirai pas que c'est possible, mais j'en sais assez pour savoir comment rechercher des noms de méthodes et s'il existe une méthode évidente appelée "isLicenseValid", il s'agirait d'écrire une classe qui possède cette méthode et retourne toujours true. 'bidouille' Je pense que ce programme est assez compliqué sans le compliquer davantage, bien qu'il semble vouloir en être sûr. Je pense que je pourrais réparer son code facilement en le renommant, oui.
Neil
Ce n'est pas parce que vous avez une méthode appelée "isLicenseValid" qu'elle peut être piratée en écrivant simplement une classe avec la même méthode. Si vous marquez votre classe comme "scellée" (c'est la syntaxe C #), les tierces parties ne peuvent pas simplement contourner vos contrôles de sécurité en écrivant des sous-classes et en surchargeant votre méthode. Dans tous les cas, à moins que ce type ne soit l'agent de sécurité de l'entreprise, pourquoi cela signifierait-il son travail si le produit est piraté?
Tundey
2
@Tundey, ce n'est pas une question de sous-classes (comment seraient-elles chargées?): Il s'agit d'écrire la même classe et de placer la version piratée plus tôt dans la liste de recherche du chemin de classe .
Peter Taylor
1
ha.Je me souviens des joies du chargement de classe en Java. Néanmoins, il doit exister un meilleur moyen d’atténuer ce phénomène. En fait, si votre chargeur de classe n'est pas compromis, comment quelqu'un peut-il écrire une classe identique à votre classe? Surtout si votre JAR est signé? Signer vos JARs et sceller vos classes ne résoudrait-il pas le problème de quelqu'un écrivant une classe portant le même nom que le vôtre?
Tundey
1
@Tundey, la JVM de Sun est (principalement) open source, vous pouvez la modifier.
Spudd86
2

Indépendamment de la valeur de votre adresse IP, l’intelligence n’est pas de modifier votre code dans l’espoir de semer la confusion parmi les pirates. Mis à part le fait que le maintien d'un futur cauchemar sera un cauchemar, cela ne résoudra pas vraiment le problème. Cela rend la tâche plus difficile mais pas impossible. Donc, ce n'est pas vraiment une solution et les effets secondaires sont mauvais. C'est comme si vous preniez des médicaments qui ne fonctionnent pas et ont des effets secondaires néfastes.

Votre problème est de savoir comment sécuriser votre adresse IP. Trouvez une solution pour cela: obfuscateurs, serveur de licences, etc.

Tundey
la source
Je suis d'accord avec toi 110%. En ce qui concerne la sécurisation de l’IP, c’est une garantie pour notre client, car c’est sa machine qui exécute l’application Web, et non la nôtre, bien que votre argument soit valable. J'étais plus préoccupé par le client qui a un accès direct à notre produit sur sa machine et peut le sélectionner. Un serveur de licences est aussi efficace que la sécurité côté client. Si vous pouvez contourner l'accès au serveur de licences, aucune astuce du livre ne vous empêchera d'utiliser le programme sans licence.
Neil
1

J'ai rencontré un problème similaire lorsqu'un autre développeur a nommé nos routines de cryptage / décryptage str__copyet str__delete(remarquez le deuxième tiret de soulignement). C'était boiteux et aurait pu être mieux fait, alors nous avons attendu qu'il y ait une histoire où la mise à jour de la licence était nécessaire. La direction n’a pas eu de problème avec les quelques heures supplémentaires qui lui ont été allouées, car nous l’avons décrite comme "un nettoyage, si bien que la prochaine fois que nous passerons aux licences, cela prendra moins de temps et sera plus sûr". Problème résolu, pas de sentiments blessés.

Christopher Bibbs
la source
Bien sûr, nous pouvons toujours le changer plus tard, bien que je pense que le changement doit être plus dans la tête que le code.
Neil
1
@ Neil Ensuite, je dirais que c'est vous qui avez besoin de changer de tête. Si le code fonctionne, qu'il est correctement testé et qu'il est bien commenté, opter pour cette voie plutôt que d'utiliser obfuscator n'est pas le meilleur choix, mais ce n'est pas la fin du monde non plus. Corrigez-le plus tard s'il y a un problème et continuez autrement.
Christopher Bibbs
@Christopher_Bibbs: Mettez votre esprit à l'aise. Je peux presque certainement vous assurer que cela posera finalement un problème.
Neil
1

Ma première pensée a été la maintenance de ce code. Si le code est déjà obscurci et qu'il passe à autre chose, bonne chance pour essayer de le maîtriser. Vous serez alors le pirate essayant de déchiffrer le code.

Au lieu de cela, je recommanderais de nettoyer le code et d'utiliser un obfuscateur pour faire tout le travail difficile. À long terme, vous aurez un code bien gérable et vous laisserez toute la complexité insensée à quiconque voudra pirater votre licence.

Rappelez-vous qu’aucun obscurcisseur n’est parfait, et qu’un pirate informatique très déterminé peut faire de l’ingénierie inverse, mais au moins ce ne sera que lui. De plus, les observateurs ajoutent beaucoup plus de complexité qu’un gars ne le peut probablement.

Steph
la source
0

Je suis tout à fait d’accord avec les réponses que vous devriez demander à votre patron à ce sujet et faire ce qu’il dit.

Cependant, un additif très important à ces réponses est que vous devez documenter vos préoccupations à la fois sur la sécurité et la maintenabilité. Que vous changiez ou non le code, il est important que les gens sachent ce qui vous préoccupe et pourquoi. C’est important à la fois de manière proactive (votre patron ne peut pas prendre une décision qu’il ne sait même pas s’il faut le prendre) et de manière défensive (si / quand un pirate informatique dénonce le système de licences mal sécurisé, il ne peut pas vous en vouloir. erreur.)

jhocking
la source
0

"Ne soyez pas le professionnel le plus qualifié pour connaître un problème".

En d'autres termes, informez votre patron et partez de là. Si vous restez silencieux et que vous êtes au sommet de la hiérarchie de ce secret, vous serez responsable lorsque vous le voudrez. Dites en passant à votre chef et laissez-le décider d'une façon de l'aborder. De cette façon, vous êtes soulagé du fardeau du choix.

Ne vous contentez pas de le dire à votre chef, car de nombreux gestionnaires ne sont peut-être pas aussi techniques, mais agissons comme nous le faisons toujours: donner le problème et les solutions possibles avec les avantages / inconvénients de chacune de ces solutions. Puis laissez-les décider et faites-les passer. C'est pourquoi les gestionnaires / dirigeants sont payés beaucoup d'argent!


la source
0

La vérité est que si on dispose de suffisamment de temps et de ressources, tout peut être craqué. C’est une fonction simple de la popularité de votre application. Plus il est populaire, plus il attire les pirates informatiques qualifiés et plus de temps est consacré à sa résolution. L'obfuscation de code fournit justement cela - un moyen d'augmenter le temps requis pour le casser, similaire à la cryptographie. Donc, si votre code est obscurci, l'attaquant doit être qualifié et y consacrer du temps, sinon il désespérera et abandonnera. Vous devez vous demander si votre application en vaut la peine des deux côtés.

En fait, il est étonnant de constater à quel point il peut être difficile de déchiffrer du code obfusqué. Vous pouvez facilement transformer un programme C simple en 10 lignes en un assemblage de 100 lignes par obfuscation. Si vous essayez de le déboguer, vous ferez un saut dans le code sans signification, ce qui peut être très frustrant. Cela finira par casser mais cela devient vraiment difficile et puisque rien n’est vraiment impossible, c’est le but. L'obscurcissement du code réduit le nombre de personnes capables de le casser.

Bien sûr, il existe de meilleurs moyens, comme d'essayer de confondre le débogueur, pas le pirate, mais un moyen économique et efficace. Cependant, nommer des choses maladroites ne suffit pas. Vous devez modifier les fonctions d'appel de flux de contrôle qui ne font pas vraiment quelque chose pour votre code global mais en augmentent la taille et la complexité: appelez des fonctions factices dont la valeur de retour n'est utilisée nulle part, à partir de fonctions internes qui font vraiment quelque chose. Vous pouvez déjà voir comment cela peut devenir vraiment déroutant.

Vous avez quelque chose que l'attaquant n'a pas. Le code source d'origine. Trouvez un moyen de mieux l’organiser pour vous-même.

utilisateur66734
la source