À 23 avril 2026, un attaquant a pu trouver et exploiter un bug dans l'un des contrats intelligents d'Aktionariat — le contrat Brokerbot — qui, sous certaines conditions, a permis de drainer efficacement la réserve stable d'un Brokerbot.
Quatre émetteurs Brokerbot Les configurations contractuelles correspondant à ces conditions préalables ont été affectées. Total des CHF 31'606 sous la forme de Frankencoin (ZCHF) a été volé par l'agresseur.
Aktionariat remboursement de toutes les pertes subies par les quatre émetteurs concernés. Le bug a été corrigé et le nouveau PaymentHub et Brokerbot les contrats ont été mis en œuvre à tous les émetteurs. La configuration qui a activé l'attaque a également été désactivée pour tous les émetteurs.
Bien que les transactions malveillantes aient impliqué interagir avec le marché primaire pour acheter et vendre les émetteurs actions tokenisées, aucune action n'a été volée. Les registres des propriétaires et des actionnaires demeurent donc intacts.
Aucun investisseur ou actionnaire n'a été affecté.
Faits
| Date d'expiration | 23.04.2026 |
| Émetteurs touchés | 4 |
| Montant volé | CHF 31'606 |
| État | Résolue. Les émetteurs ont été entièrement remboursés et le bogue a été corrigé. |
Ce qui s'est passé
Le bogue a été causé par un calcul erroné dans l'un des contrats intelligents d'Aktionariat qui, dans des circonstances spécifiques et avec des transactions spécialement construites, permettent à l'acheteur de recevoir une part de plus qu'ils n'auraient dû recevoir en fonction du prix payé. Cela n'a été possible que dans les configurations avec une augmentation positive des prix, où le prix de l'action augmente de façon monotonique avec chaque achat.
Pour y parvenir, un attaquant a dû trouver des entreprises où :
- les rachats sur le marché primaire ont été rendus possibles,
- une augmentation de prix non nulle a été fixée, et
- il y avait au moins un solde de ZCHF sur le Brokerbot contrat.
L'attaquant a ensuite exploité le bogue en boucle sur le même calcul défectueux plusieurs fois dans une seule transaction. Dans chaque itération, l'agresseur :
- a acheté des actions dont le montant est très spécifique, recevant ainsi une part de plus que celle qui est payée; et
- a vendu toutes les actions, y compris la plus élevée, ce qui a réduit le prix d'une action dans ZCHF.
La boucle a continué jusqu'à la totalité de la réserve ZCHF de la Brokerbot Le contrat a été vidé. À la fin de la transaction, le ZCHF volé a été immédiatement converti en ETH et transféré. Les robots MEV ont été utilisés pour obfusquer l'agresseur et pour éviter les pools de transactions publiques.
À la découverte du bogue, Aktionariat, en parallèle:
- a identifié la cause fondamentale, les conditions préalables et les émetteurs qui ont été ou pourraient être affectés;
- a calculé l'impact et a décidé que toutes les pertes seraient couvertes par Aktionariat;
- a commencé à mettre en œuvre et à déployer un patch et une configuration qui supprime le bogue et rend la configuration défectueuse impossible; et
- a commencé à planifier la communication directe avec les clients touchés.
Cause fondamentale technique
Le calcul erroné est en getShares, une fonction qui calcule le nombre d'actions à recevoir pour un montant donné de ZCHF:
fonction getShares(uint256 argent) retour de vue publique (uint256) {
uint256 currentPrix = getPrice(); uint256 min = 0; uint256 max = argent / courantPrix; pendant (min < max){
uint256 milieu = (min + max)/2;
uint256 totalPrice = getPrice(currentPrice, middle); if (money > totalPrice){
min = milieu + 1;
} Autre {
max = milieu;
}
}
retour min;
} Les parties problématiques sont mises en évidence ci-dessus. Plus important encore, si les données de l'argent est supérieur au Prix total, la boucle sort avec min = milieu + 1, même si le paiement supplémentaire pourrait être bien inférieur au prix d'une action pleine. Notez que ce chemin n'est utilisé que lorsqu'un incrément de prix est défini.
Le contrat PaymentHub qui a déclenché la transaction ne vérifiait pas non plus le résultat retourné, par exemple en appliquant simplement que getBuyPrix(montant de la part) < total payé — qui aurait empêché l'exploitation du calcul erroné.
Mémodie
- Aktionariat a détecté les montants volés dans le Brokerbot et remboursés intégralement aux émetteurs concernés. En conséquence, aucun émetteur n'a perdu d'argent.
- Amélioration Brokerbot Le contrat a été développé et déployé pour corriger le bug de calcul.
- Un contrat PaymentHub amélioré a été élaboré, déployé et déployé aux émetteurs par des propositions multisig. Le nouveau contrat PaymentHub vérifie la santé des paiements et bloque les erreurs hors pair.
- Les rachats ont été désactivés pour les Brokerbots à risque. Sans la mise à jour de PaymentHub, cette mesure seule aurait encore permis à un attaquant d’obtenir une action de plus que prévu. Cependant, les attaquants sur la blockchain cherchent généralement un gain immédiatement réalisable plutôt qu’à conserver des actions ou des tokens. Désactiver les rachats bloque donc efficacement l’attaque.
- Nouveaux contrats d'investissement direct Aktionariat n'ont pas la fonction de rachat, de sorte que l'ensemble du bloc problématique (mais maintenant corrigé) est déjà hors de propos et a été supprimé.
Enseignements tirés
La plus grande surprise et leçon pour nous a été de trouver un bug avec un impact critique dans les contrats qui ont passé des contrôles de sécurité et des audits officiels à plusieurs reprises. Ce bug était en place depuis au moins cinq ans et a échappé en quelque sorte à l'examen de tous nos développeurs de contrats intelligents, à la fois cofondateurs techniques et deux audits payés. Cela nous amène malheureusement à remettre en question la valeur des audits que nous avons reçus de nos vérificateurs.
Le fait que le bug ait été dormant pendant cinq ans et n'a refait surface que maintenant, il donne des indications aux attaquants en utilisant des outils assistés par l'IA qui rendent les recherches plus larges et automatisées viables. Une augmentation significative des exploits sur la scène crypto en général a été observée, ce qui nécessite des pratiques de sécurité plus strictes et l'utilisation de l'IA pour la défense et l'audit continu.
Remerciements
Nous prenons l'entière responsabilité de cet incident et nous excusons sincèrement tous les émetteurs concernés. Nous ne pouvons que nous assouplir du fait que nous avons pu rendre tous les émetteurs entiers, analyser et contenir les dommages, mettre à jour les contrats touchés le plus rapidement possible et marquer cet incident comme résolu sans que nos émetteurs ou investisseurs n'en subissent aucune perte.
Liste complète des transactions malveillantes
La liste complète des transactions malveillantes est fournie ci-dessous pour une transparence totale. Chaque entrée se connecte à la transaction sur Etherscan.
- 0x3da650003c91c0f0448db3061388fd180c83e0afc650ae7ccb4b61f1145b1993
- 0x6a20cccec96cacbdec2b240a4f9329d607d247cb8b8205472f494c31f0fd54fd
- 0x79e4adfa9a8afa1ddcf99fddbe713eb47822e9fe1f1439cdabe43e50cf136365
- 0xcc4b49fa2b5e65850961ea1d7cbb3511b0c4c492c920e38e8c8caebf685a8bce
- 0x4121a5144b59cb7c3b819ed1ad0b70cf6bcb83588bbd79264f048ca0a8824eea
- 0x31a61622c822b743065cfaaec873c8dcf60e92797da1d2750ecada96c394f7c7
- 0x428065e30818b34c08a7dc9498d22f022a0f8c210afb4c94e59b00b3eb665df0
- 0x97e51a45b18349e9c7b286404fb53ecfd1995b25183a6ffc9323ff84559af02d
- 0x8a0b1309509a59c3deffa6708f9a50fc1b06575720d01f04ddd451f5f02f4912
- 0xa0013c77841955e2fe2a1109711fe3883088d33bbc1a425df3fc7d82cff00ad4
- 0x21ed5bd91f4c4f5d20d3fd919f6907f0183175f211b3821ad723d453b6141bd6
- 0x62826f656a48c7f9dc0d63cafea2b0a129516b4f321f57d97edbde28a2e26789
- 0x2c64144449273a05ddefa2f5f1edd9a17cabc7a295493d3df75b0ad2b122b261
- 0xd3678399c89b39bf6fbeb6fe18e8144518d4375c8038fe4e0db9f199227e748a
- 0x060c500df97031b30344e9ab42e478d86e35c3d445c42d3c378719764ca6dd46
- 0x88c5021e4570ec6f6c4a3c7d6577a0b61ff241c82612e0db597f206579a0cf49
- 0x522b0d4cb01a0bdaeb7eaf83a25c65bb04189b73c0882101539da269c8bf274f
- 0x01b5b03f514c5bde4c1ab074a980f25b498425c6d095b9717eaa8baec5af1cbb
- 0xa6e6aef25e6cb47a1cdaca79bb5b9065a57ae1aacf7b66b1af5a0ce3e901b379
- 0x7103d1cff801ee3b47a9ad94d5662bb33c578ac87cb5540e323fbbabbbada107
- 0x591f92ae130b471967852e44e313e592a2c3952201d28fc5623c3b7acf6e0721
- 0x03dc52dc2ef5636bc743c0c483fa5dbbeb76987d503788d5d4ade27ba4248b99
- 0xc48829bf264ce902d4c9ae9b21dfdf5fed871c161ae11bb81c999460f24321e4
- 0x2cbd3ca44907a9e5be1548a13dd516e7e9bb027b7d6a8df7c93a495144d6af23
- 0x57c6816bb44a5f0b43665f9a43c9170ef01740b84f5bd46a2ebcd1707c1a1b87
- 0xdd661886937547428bbf1c6de48bba5fd3efb88b2c0a99beb604984a001e7d6f
- 0xef0a00e196b35208ecc8155a73e387e274fd3a99e1c84675ecb41c4e38f24ccd
- 0x7154c6546220abd7f8ffc0225898becea4982dd1ffea26d571d17bf0dc3989cd
- 0x7476463d1d90e70c28f283658741ae1554b4a2e58ad08d3697c5dfd1ab64f691
- 0x2ae251fe4a44528e0ef5f03838e6e9d724db18a12930472b07615dbdd3eacf67
- 0x89e4ce31724c061e9a01084d20abbf1ddd1ea4aa421b7d797847c6f062f9c073
- 0x728a1855d18833159a40f41114296b334fc7ae16a85c0408eba1d3c2e8553a0d
- 0x7859465d6888cb88b485c85315363698196f031f89132ccc2898a75fa9a89fa5
- 0x98b9064183a258f8c37c43c2c20eab52a1d0ee948718f10aa18ff0e3955807bb
- 0x18b0c2e3bbda38b51abbcea0ca7a8694a92c5dc66bd77372f5499d1e3ddca805
- 0xec23cfd15c1a45d7e48c86a94c4dec417a11df05a9b8824a45e60dd715a23bc2
- 0x79fdc34f50a8867b7e67e25fe4953a7725b4439aeac4f0e4e1e20018d2ace564
- 0x4771e1970ff936b692c8f685fcb604611876428aaa1ab1ab6ace11441cbfc26e
- 0x6061cfe75a67a54f26868701119906ecf4f7f626e2c9e6fb11430b6745f51cc8
- 0xead00d973e111b08a07bdf4c7f6921dc47258ed2f45b543dd5ee4bde977958d6
- 0x3d529aba76f0130c9d7c11c0fdeda183154e187fadf98183974aca70b7aed82a
- 0xce0e9fe255fd20bcda2f94de18641125d2d4690d9d714494b416ba2a3f6b53fd
- 0xd97370a3010f56170d538046d21c3030bcb09b0bf06cb8924cf30649aa97bc1f
- 0x2a132ec9f8cc47ca50a4b1576bca855dcdd72e11ef2cca29a64804fccd40d4df
- 0x70c269301a27377e9e67d2ec73daeb38e965e02632cf413f3dcff0858f8a4514
- 0x2f1362ae67e530a522c2cfa0586edc3e0726339799dcd02f68213b60b5a45930
- 0x47318425e74a717cec0604938f07b72f7d54589e49cfeae518afba896ceb4539




