Опубликованные ИИ-аудиты Biatec Wallet выявили критическую уязвимость в подписании свопов
Biatec Wallet — браузерный кошелёк Algorand с открытым исходным кодом — публикует в своём репозитории на GitHub аудиты безопасности, выполненные ИИ. Аудит августа 2026 года выявил критическую уязвимость слепого подписания в свопах; исправление уже поставляется в развёрнутом кошельке.
Аудиторский след, написанный машинами
В мае 2021 года проект, который сегодня называется Biatec Wallet, выпустил первую публичную версию: создать кошелёк, защитить его паролем, посмотреть базовую информацию об аккаунте — и всё это во вкладке браузера. Пять лет спустя та же кодовая база, переименованная и разросшаяся под брендом Biatec1, по-прежнему работает целиком в браузере и обзавелась практикой, необычной для небольшого общественного кошелька: она публикует датированные отчёты об аудите безопасности, написанные ИИ-моделями, прямо в своём публичном репозитории на GitHub2 — вместе с живым реестром всех рисков, которые эти аудиты выявили.
Самый свежий отчёт, датированный 4 августа, открывается предупреждением, которое большинство проектов предпочло бы спрятать: «Главный результат отрицательный: этот аудит выявил одну критическую и одну высокую находку, и обе представляют собой реалистичные пути к полной потере средств аккаунта». Обе находки относятся к функции свопа — единственному месту в кошельке, где приватный ключ пользователя на короткое время соприкасается с выводом удалённого сервера, — и то, как их обнаружили и исправили, неплохо показывает, что такая программа самостоятельно публикуемых аудитов может гарантировать, а что нет.
Кошелёк, который не прикасается к вашим ключам
Biatec Wallet — бесплатный некастодиальный кошелёк Algorand с открытым исходным кодом, созданный компанией Scholtz & Company, jsa. из Братиславы, Словакия (company ID 51 882 272, VAT SK2120828105) и развиваемый под брендом Biatec. Некастодиальность означает, что приватные ключи никогда не оказываются у третьей стороны: нет ни бэкенд-сервера, ни формы регистрации, ни KYC, а файл кошелька зашифрован алгоритмом AES-256 и хранится в собственной базе IndexedDB браузера. Пароль используется только локально, для шифрования и расшифровки, и никуда не передаётся — в том числе в собственную инфраструктуру Biatec; сам кошелёк блокируется через пять минут после последней активности, стирая расшифрованный ключ из памяти. Проект называет себя первым кошельком Algorand с открытым исходным кодом; судя по публикациям в СМИ, официальный кошелёк Algorand стал полностью открытым лишь в июне 2021 года — через месяц после первой публичной версии AWallet.
Попробовать его просто: нужны браузер и придуманный пароль. Откройте wallet.biatec.io3 — в README проекта старый домен a-wallet.net помечен как устаревшее зеркало того же развёртывания, — задайте имя кошелька и пароль (приложение советует не меньше двенадцати символов со сменой регистра, цифрами и специальными знаками), и файл кошелька создаётся локально. По умолчанию приложение работает в основной сети и обращается к публичным узлам AlgoNode, а в настройках можно сменить провайдера — в том числе на собственные узел Algorand и инфраструктуру индексатора от Biatec.
Как устроена программа аудитов
Процесс описан в файле ai-audit-instructions.md: набрав в репозитории 'do new audit', вы запускаете новый проход ИИ-модели, которая должна действовать так, как это сделала бы «профессиональная компания по аудиту безопасности смарт-контрактов и кошельков», — скептически, с позиции противника и с точной оценкой серьёзности, причём каждая находка привязана к конкретным путям к файлам и номерам строк. Каждый отчёт фиксирует проверенный коммит, модель, которая его выполняла, и версию инструкций; реестр рисков переносит каждую находку вперёд навсегда — строки никогда не удаляются, а закрытые сохраняются для прослеживаемости.
| Понятие | Что это значит на практике |
|---|---|
| Шесть отчётов с 9 июля по 4 августа 2026 года от трёх разных ИИ-моделей (sonnet-5, fable-5, grok-4-5) | Ни одна модель не задаёт программу единолично; предполагается, что каждый проход заново проверяет прежние находки по текущему исходному коду |
| Проход 4 августа просмотрел 214 коммит и 48 файлов (+2,407/−564 строк) с момента предыдущего отчёта | Проверка ограничена диффом — рассматривается каждый релизный цикл, а не только новые заметные функции |
| Сканирование зависимостей выявило 155 предупреждений (0 критических, 9 высоких, 4 средних, 2 низких) | Кошелёк собирается с деревом зависимостей, в котором есть известные предупреждения высокой серьёзности, но ни одного критического |
| По данным реестра, после 4 августа остаётся 20 открытых технических рисков | Собственный опубликованный реестр проекта говорит, что два десятка рисков на уровне кода всё ещё не закрыты |
| Тесты Cypress E2E и live-тесты (Ledger, WalletConnect, реальный своп) не проводились | Критическая и высокая находки прослежены по статическому исходному коду, а не подтверждены на работающем развёртывании |
Находка: свопы подписываются вслепую
Критическая находка, зарегистрированная как AW-2026-043, касается той единственной части кошелька, которая по своему устройству должна на мгновение довериться чужому. Когда пользователь обменивает один актив на другой, кошелёк просит агрегатор — Deflex, Folks Router или Biatec Router — рассчитать маршрут и вернуть неподписанные транзакции для сделки. Кошелёк расшифровывает эти транзакции и подписывает их напрямую необработанным приватным ключом аккаунта. Аудит выявил, что ни один из трёх путей ничего не проверял в транзакциях, присланных сервером: ни то, что отправитель — это собственный аккаунт пользователя, ни получателя и сумму против показанной котировки, ни даже genesis ID сети; и транзакции вообще не отображаются пользователю до подписания. Пользователь нажимает одну кнопку Execute — и непрозрачный набор удалённых транзакций подписывается его ключом.
Ставки здесь определяются тем, как устроены транзакции Algorand. Подписанная транзакция может нести поля помимо «заплатить X получателю Y»: поле closeRemainderTo закрывает аккаунт, сметая весь его баланс ALGO — а при переводе актива всё держание токена — на адрес, указанный в поле, а поле rekeyTo передаёт право подписи за аккаунт совершенно другому ключу. В Algorand смена ключа позволяет аккаунту делегировать право подписи другому ключу; реестр затем фиксирует, какой ключ фактически подписал. Скомпрометированный или злонамеренный API агрегатора мог бы вернуть именно такую транзакцию, и кошелёк молча подписал бы и отправил её — в обход красных предупреждений о закрытии и смене ключа, которые более раннее исправление (AW-2026-001) добавило во все остальные места подписания в приложении.
Вторая находка: проверка домена, которая доверяет атакующему
Высокая находка, AW-2026-044, находится в новой функции подписания произвольных данных ARC-60. ARC-60 расширяет WalletConnect — протокол с QR-кодом, который позволяет веб-приложению подключаться к кошельку и запрашивать подписи, никогда не получая ключей, — так что подключённое DApp может запросить аутентификационную подпись над произвольными данными; на этом строятся схемы входа без пароля. Кошелёк показывает запрашивающий домен, цель и полный предпросмотр данных перед подписанием. Аудит обнаружил, что проверка привязки к домену ссылалась сама на себя: и заявленный домен, и authenticatorData, которые должны его подтверждать, приходят внутри одного и того же запроса, контролируемого DApp, и сверяются только друг с другом, а не с реальным партнёром сессии WalletConnect. Поэтому злонамеренное DApp могло получить действительную подпись, привязанную к любому домену, который пожелает назвать, — а это ровно тот поддельный вход, который, судя по комментарию в самом исходном коде функции, она предотвращает.
Что есть в текущем коде — и что пока не проверено
Исправление появилось в тот же день, когда был опубликован отчёт (коммит 0b3947e, 'feat: enhance ARC-60 security and DEX aggregator transaction validation'). Новый общий помощник assertSwapTransactionSafe теперь прогоняется по каждой транзакции, прежде чем подпишет любой из трёх агрегаторов, и отклоняет весь пакет, если отправитель не совпадает с подключённым аккаунтом или если какая-либо транзакция несёт поле смены ключа либо закрытия аккаунта. На стороне ARC-60 новая проверка domainMatchesSessionOrigin сравнивает заявленный домен с именем хоста реального партнёра сессии WalletConnect, а не с собственными данными запроса.
Исправление есть и в master, и в развёрнутом кошельке: сообщения об отказе от этой защиты присутствуют в минифицированном бандле JavaScript, который отдаёт a-wallet.net, — то есть код проверки действительно попадает к пользователям, а оба домена отдают одну и ту же сборку (36221a6, 13 августа). Чего пока не произошло, так это проверки исправления той самой программой, которая нашла ошибку. Последняя запись реестра рисков — это сам аудит от 4 августа, который проверял более ранний коммит; коммит с исправлением появился отдельно в тот же день, и более позднего отчёта об аудите в репозитории нет, чтобы подтвердить закрытие AW-2026-043 и AW-2026-044.
Этот неподтверждённый статус стоит взвесить вместе с тем, чем эта программа на самом деле является. Аудиты выполняют ИИ-модели по собственному постоянному заданию проекта, ни в одном из шести отчётов не названа независимая компания по безопасности, а в репозитории нет помеченных тегами релизов — сборки уходят прямо из конвейера CI/CD, — так что опереться на какой-либо этап сертификации релиза не получится. В отчёте от 4 августа прямо сказано, что его главные находки прослежены по статическому исходному коду, а не доказаны на работающем развёртывании. Как эксперимент с прозрачностью программа действительно необычна: большинство кошельков публикуют краткие обзоры аудитов, а не сырые файлы в духе «что мы нашли в этом месяце». Как независимая гарантия безопасности она пока не покрывает даже собственные самые свежие исправления.
Общественный проект, финансирующий себя сам
Biatec не зависит от Algorand Inc. и Algorand Foundation и не получает от них постоянного финансирования, говорится в её FAQ, но проект привлекал разовые гранты сообщества xGov. В репозитории xGov в статусе Approved зафиксированы 10,000 ALGO на сам AWallet и 60,000 ALGO на его планировщик платежей; две заявки 2024 года — ретроактивный запрос на 36,912 ALGO и проект ончейн-идентичности на 148,999 ALGO — значатся как Final. Собственная формулировка проекта, приведённая в аннотации ретроактивного предложения, такова: AWallet — «один из самых продвинутых кошельков в Algorand».
Финансовый след за этим заявлением невелик. На опубликованном адресе для пожертвований лежит 25.6 ALGO и примерно 1.03 USDT в сети; в Discord проекта 411 участников, из них 7 были онлайн на момент проверки; самый заметный недавний пост о кошельке, в Bluesky, собрал один лайк. Сама разработка не замерла: последний push в репозиторий был 15 августа, у него 672 звезды, а на двух главных контрибьюторов приходится 546 и 62 коммита соответственно.
Одна вещь, которую читателю стоит взвесить: экран свопа в кошельке маршрутизируется через собственный агрегатор Biatec наряду с двумя сторонними роутерами, а Biatec ещё и управляет инфраструктурой узла Algorand и индексатора, к которой кошелёк может подключаться. Само по себе это не проблема — некастодиальная архитектура означает, что кошелёк подписывает только то, что одобрил пользователь, — но аудит от 4 августа как раз показывает, почему слой агрегатора и есть та граница доверия, которая имеет значение, и собственный роутер команды стоит прямо на ней.
Та же словацкая компания построила вокруг Algorand целый набор инструментов: бесплатный платёжный шлюз с открытым исходным кодом, позволяющий продавцам принимать ALGO, USDC или USDT напрямую на свой счёт без финансового посредника и без аккаунта в кошельке, открытую систему голосования и национальный фреймворк стейблкоина Stabilitas, который, как ранее выясняло это издание, остановлен с 2023 года. Программа аудитов кошелька, каковы бы ни были её ограничения, — та часть этого портфеля, где команда показывает свою работу в наиболее доступном для проверки виде.
Источники
- Biatec Wallet3 (a-wallet.net отдаёт ту же сборку)
- Репозиторий scholtz/wallet на GitHub2 — README, инструкции по аудиту, реестр рисков, отчёты об аудите, validate.ts, arc60.ts
- FAQ кошелька6
- Журнал изменений кошелька7
- Страница пожертвований8
- Предложения xGov 9, 90, 199, 2009
- Biatec Wallet - Algorand Community Wallet10
- Biatec Wallet - Algorand Community Wallet11
- Biatec12
- raw.githubusercontent.com13
- raw.githubusercontent.com14
- raw.githubusercontent.com15
- История для src/scripts/aggregators/validate.ts - scholtz/wallet · GitHub16
- Biatec Wallet - Algorand Community Wallet17
- Лучшие кошельки Algorand в 2026 году: надёжные места для стейкинга ALGO - Coin Bureau18
- Biatec Wallet - Algorand Community Wallet19
3 цифры в этом материале проверены.Все проверки
Источники
- 1Biatec biatec.io↩
- 2публичном репозитории на GitHub github.com↩
- 3wallet.biatec.io wallet.biatec.io↩
- 6FAQ кошелька a-wallet.net↩
- 7Журнал изменений кошелька a-wallet.net↩
- 8Страница пожертвований a-wallet.net↩
- 9Предложения xGov 9, 90, 199, 200 github.com↩
- 10Biatec Wallet - Algorand Community Wallet a-wallet.net↩
- 11Biatec Wallet - Algorand Community Wallet wallet.biatec.io↩
- 12Biatec biatec.io↩
- 13raw.githubusercontent.com/scholtz/wallet/master/src/scripts/aggregators/biatec.ts raw.githubusercontent.com↩
- 14raw.githubusercontent.com/scholtz/wallet/master/audits/risk-registry.md raw.githubusercontent.com↩
- 15raw.githubusercontent.com/scholtz/wallet/master/src/scripts/aggregators/types.ts raw.githubusercontent.com↩
- 16История для src/scripts/aggregators/validate.ts - scholtz/wallet · GitHub github.com↩
- 17Biatec Wallet - Algorand Community Wallet a-wallet.net↩
- 18Лучшие кошельки Algorand в 2026 году: надёжные места для стейкинга ALGO - Coin Bureau coinbureau.com↩
- 19Biatec Wallet - Algorand Community Wallet wallet.biatec.io↩