2010-07-08 11 views
9

Je lis Stack Overflow depuis un certain temps, mais c'est ma première question postée.Comment puis-je m'assurer que quelqu'un n'envoie pas de fausses données?

J'ai ce programme de suivi écrit en C# qui recueille des informations sur l'utilisation de l'ordinateur local et les envoie à un serveur. Les données sont au format XML, envoyées une fois par ~ 10 minutes. Mon problème: peu importe comment je crypte les données XML (symétriques ou asymétriques), quelqu'un peut toujours décompiler mon programme de suivi C#, déterminer les conventions clé/certificat/cryptage que j'utilise et écrire un autre programme qui envoie de faux rapports au serveur.

Le programme de suivi fonctionne sous l'hypothèse que l'utilisateur qui l'exécute peut être intéressé par l'envoi de faux rapports. 1) Comment puis-je m'assurer (aussi sûrement que possible) que les données sont envoyées par le vrai tracker au lieu d'un clone/faker? 2) comment est-ce que je peux assez obscurcir le code assez pour que la récupération de clés/certificats/conventions de chiffrement devienne un enfer/presque impossible?

Je veux passer peu ou, de préférence pas d'argent sur la solution (donc 500 $ obfuscators sont hors de question. Je suis un étudiant à l'université et je suis pas cher :)

Merci à l'avance.

+4

Réponse courte: Vous ne pouvez pas. Les éditeurs de logiciels consacrent énormément de temps et d'efforts à essayer quelque chose de similaire, et il est invariablement cassé dans les heures qui suivent sa disponibilité. –

+0

Personnellement, je ne dépenserais pas d'argent dessus, car même les solutions coûteuses sont facilement brisées si quelqu'un est déterminé à donner de fausses données. Vous ne pouvez jamais "vous assurer" que les données sont valides, seulement essayer et dissuader les gens de les essayer. –

Répondre

0

1.Une autre approche: En supposant que vous ne changiez pas souvent votre exécutable. faites un DigSig de votre (HASH + Encrypt) votre image de fichier exécutable client et envoyez-le avec, cela authentifierait votre client en tant que vrai client et non une version modifiée. Mais cela ne peut empêcher l'envoi de données par un client totalement différent qui peut acquérir le Digsig de votre image exécutable.

+1

Diffie-Hellman ajoute très peu de valeur supplémentaire sans un tiers. Assez facile à utiliser si tout ce dont vous avez besoin est sur la machine. –

+0

@erickson Oui. C'était stupide. Pour le scénario de l'OP, peu importe que ce soit symétrique/asymétrique. –

1

En théorie, une application ne peut tout simplement pas se protéger lorsqu'elle s'exécute dans un environnement non approuvé. Donc, la réponse à la première question est: "Vous ne pouvez jamais être sûr que les données sont envoyées par le vrai tracker."

En pratique, l'obfuscation va contrecarrer les attaquants jusqu'à un certain point. Le point est déterminé par la qualité de l'obfuscation et la motivation de l'attaquant. Ainsi, la réponse à la deuxième question dépend de l'identité de l'attaquant, de sa capacité et des ressources qu'il peut appliquer à ce problème. Obfuscation qui est "enfer/next-to-impossible" pour un profane démotivé à démêler peut être triviale pour un expert, ou quelqu'un qui peut embaucher un expert.

Here is a list de certains obturateurs C#.

+0

vérifier. NET réflecteur, l'un des meilleurs décompilateurs que j'ai jamais vu (et c'est gratuit) –

1

L'utilisateur client aura-t-il des droits d'administrateur sur la machine? Cela ressemble au type d'application qui serait installé par un administrateur, mais utilisé par des utilisateurs non-administrateurs. Si c'est le cas, vous pouvez peut-être stocker votre clé ou votre hachage à l'abri des utilisateurs normaux et exécuter l'application dans le contexte de l'utilisateur administrateur. Je ne connais pas vraiment le magasin de clés, mais je m'attendrais à ce que toutes les versions de Windows (au moins XP +) aient cette fonctionnalité disponible. Si ce n'est pas le magasin de clés, alors peut-être un fichier situé dans un répertoire crypté appartenant à l'utilisateur admin.

Si votre utilisateur cible a des droits d'administrateur local, alors je ne vois vraiment pas comment vous pouvez les arrêter.

+0

"exécuter l'application dans le contexte de l'administrateur". Ce serait un trou de sécurité potentiel. – jgauffin

+0

Que diriez-vous juste dans le contexte d'un autre utilisateur non-administrateur? –

1

Cela semble assez désespéré.Votre outil de suivi s'appuie probablement sur Windows pour fournir les métriques, par exemple en appelant finalement GetUserName()/GetTickCount()/CollectPerformanceData()/etc. Donc, un méchant doit juste piéger votre code (peu importe comment il est obscurci et sans se soucier de décompiler) à n'importe quel point d'entrée Windows, remplacer les données fausses, et laisser votre code continuer sur sa voie joyeuse.

La vie est trop courte pour vous battre la tête contre ces murs de briques.

1

Nous avons utilisé une solution matérielle pour fournir cette fonctionnalité requise.

J'ai travaillé avec un produit appelé IronKey, c'est un périphérique matériel capable de générer des signatures numériques. Lorsque nous émettons l'appareil, nous stockons la clé publique sur notre serveur. Lorsque notre application client soumet des données, nous générons une signature en utilisant la clé privée, une fois que nous recevons les données, nous pouvons vérifier qu'il a été envoyé à partir du bon client en utilisant la clé publique.

+0

Cela prouve que le rapport a été envoyé à partir d'une boîte avec le dongle, mais il ne garantit pas que les données n'ont pas été truquées par un logiciel modifié fonctionnant sur la boîte. –

+0

Les données sont signées par l'appareil, le client envoie à la fois les données et la signature au serveur, le serveur vérifie la signature par rapport aux données et la signature à l'aide de la clé publique stockée. Si la vérification échoue, nous savons que les données ont été truquées ou qu'elles utilisent une mauvaise clé privée. La clé de fer n'est pas seulement un dongle, elle fournit la signature et la vérification du matériel via pkcs11. –

+0

il génère des données par programme toutes les 10 minutes. signer des données ne garantit pas que son programme n'a pas été compromis. –

2

Comme Raph Koster once put it, écrit au sujet de la lutte contre les pirates dans les jeux en ligne client-serveur,

Ne faites jamais confiance au client. Ne mettez jamais rien sur le client. Le client est entre les mains de l'ennemi. N'oublie jamais jamais cela.

Malheureusement, pour à peu près toutes les applications du monde réel qui exige que la puissance de traitement du client est utilisé, quelque chose doit être mis sur le client, et donc parce que la disposition d'un attaquant malveillant. La question qui doit être posée - comme pour toute mesure de sécurité - est de savoir combien de temps et d'argent êtes-vous prêt à dépenser pour atténuer ce risque? Certaines personnes aiment attirer l'attention des gens qui se posent des questions sur l'obscurcissement ou les mécanismes d'octroi de licences côté client: «Oh, ça ne sert à rien, ça finira par être brisé». Mais c'est manquer le point: que le but de telles mesures est de repousser cette 'future' dans le futur, au point que pour un attaquant insuffisamment déterminé, ce sera 'jamais'. Par exemple: si votre application envoyait ses données par courrier électronique en clair, cela éliminerait environ zéro attaquant. L'envoyer dans l'email rot13 pourrait vaincre peut-être 5% des attaquants. L'envoyer crypté en utilisant le nom d'utilisateur comme une clé serait vaincre plus. Obfusciter le code d'envoi avec un obfuscator libre serait vaincre plus. Obfusciter avec un obfuscator de qualité commerciale serait plus vaincre. Obliger chaque client à avoir un dongle matériel permettrait de vaincre tous les attaquants, sauf les plus déterminés, comme les gens aiment le dire, mais ce serait probablement un coût insupportable. De «Je suis étudiant à l'université», je suppose que ce projet n'est pas le plus sensible de tous les temps. Utilisez un obfuscator gratuit et cryptez les données envoyées en utilisant certaines informations spécifiques à l'utilisateur comme clé. Ça va probablement faire.