BeaverTail та OtterCookie — це нове покоління шкідливих програм, що поєднують кейлогінг, крадіжку даних і можливість віддаленого керування пристроями через Node.js-модулі. У статті показано, як зловмисники використовують фейкові пропозиції роботи, троянезовані npm-пакети й розширення для VS Code, щоб заразити комп’ютери розробників.
У цьому матеріалі розглядаються деякі тактики, методи та процедури (TTP) і зміни в інструментах, які з часом були розроблені іншим великим кластером діяльності Contagious Interview. Ці кампанії зосереджені навколо інструментів BeaverTail та OtterCookie.
Група Famous Chollima часто застосовує BeaverTail і OtterCookie, причому багато окремих підкластерів діяльності встановлюють InvisibleFerret — модульне корисне навантаження на основі Python. Спочатку BeaverTail та OtterCookie були окремими, але взаємодоповнюючими сутностями. Згодом їхня функціональність почала зливатися в єдину структуру, доповнену новими модулями OtterCookie.
Одна з таких кампаній була зафіксована в організації зі штаб-квартирою у Шрі-Ланці. Вона не була ціллю навмисної атаки, проте одна з її систем у мережі була заражена. Ймовірно, користувач став жертвою фальшивої пропозиції роботи, у якій йому запропонували встановити троянську програму Node.js під назвою Chessfi у межах сфальсифікованого процесу співбесіди.
Після детального аналізу з’ясувалося, що інструменти, використані в цій кампанії, мали ознаки BeaverTail та OtterCookie, стираючи межу між ними. Виявлений код також містив низку нових функцій, які раніше не зустрічалися.
Цей блог зосереджений на модулях OtterCookie та не надаватиме глибокого занурення у відомі функції BeaverTail та OtterCookie. Хоча деякі з цих модулів вже відомі, принаймні один раніше не був задокументований. Наведені приклади вже деобфусковані, а за допомогою LLM назви функцій і змінних замінено на ті, що відповідають їхній реальній функціональності.
У цій кампанії виявлено модуль кейлогера та створення скріншотів, який раніше не був задокументований. Попередні зразки OtterCookie із цим модулем були завантажені на VirusTotal у квітні 2025 року.
Модуль кейлоггера використовує пакети «node-global-key-listener» для кейлоггера, «screenshot-desktop» для створення скріншотів робочого столу та «sharp» для конвертації зроблених скріншотів у веб-зручні формати зображень.
Модуль налаштовує пакети на прослуховування натискань клавіш і періодично робить скріншот поточного сеансу робочого столу, щоб завантажити його на сервер командного керування (C2) OtterCookie.

Натискання клавіш зберігаються у тимчасовій підпапці користувача windows-cache з назвою файлу «1.tmp», а знімки екрана зберігаються в тій самій підпапці з назвою файлу «2.jpeg». Хоча кейлогер працює в циклі та очищує буфер щосекунди, знімок екрана робиться кожні чотири секунди.
Також було виявлено один екземпляр модуля, де моніторинг буфера обміну був включений у код модуля, розширюючи його функціональність до крадіжки вмісту буфера обміну.
Дані кейлогу та зроблені скріншоти завантажуються на сервер OtterCookie C2 через певний TCP-порт 1478, використовуючи URL-адресу “hxxp[://]172[.]86[.]88[.]188:1478/upload”.

Під час пошуку схожих зразків на VirusTotal було виявлено нещодавно завантажене розширення VS Code, яке може запускати OtterCookie після встановлення в середовище редактора жертви. Розширення є фальшивим помічником з адаптації, що нібито дозволяє користувачеві відстежувати та керувати тестами кандидатів.
Хоча достеменно не встановлено його зв’язок із Famous Chollima, це може свідчити про експерименти зловмисників із новими векторами доставки. Водночас не виключено, що розширення є результатом тестування іншого актора або дослідника, який не має відношення до діяльності групи.

Розділ коду OtterCookie починається з визначення об’єкта JSON, який містить значення конфігурації, такі як унікальний ідентифікатор кампанії та IP-адреса сервера C2. Розділ коду OtterCookie створює додаткові модулі з рядків, які виконуються як дочірні процеси. Під час аналізу атаки було виявлено три основні модулі, а під час пошуку схожих зразків у репозиторіях та на VirusTotal — ще один додатковий модуль.
Перший модуль є фундаментальним для OtterCookie та починається з виявлення зараженої системної платформи та перевірки віртуальної машини, після чого зібрана інформація про користувача та хост надсилається на сервер OtterCookie C2.

Після надсилання системної інформації модуль встановлює пакет socket.io-client, який підключається до вказаного порту на сервері OtterCookie C2 і в циклі очікує команд для виконання. Спочатку зв’язок відбувається через HTTP, а потім переключається на протокол WebSocket; зафіксовано прослуховування TCP-порту 1418.

Зрештою, залежно від операційної системи, цей модуль періодично перевіряє вміст буфера обміну за допомогою команд «pbpaste» у macOS або «powershell Get-Clipboard» у Windows. Він надсилає вміст буфера обміну на URL-адресу сервера C2, яка спеціально використовується для реєстрації активності OtterCookie, за адресою «hxxp[://]172[.]86[.]88[.]188/api/service/makelog».
Цей модуль перераховує всі диски та переглядає файлову систему, щоб знайти файли для завантаження на IP-адресу OtterCookie C2 за певним портом та URL-адресою (у цьому випадку «hxxp[://]172[.]86[.]88[.]188:1476/upload»).
Цей модуль містить список імен папок і файлів, які потрібно виключити з пошуку, а також інший список із розширеннями імен цільових файлів та шаблонами пошуку імен файлів для вибору файлів для завантаження.

Список «цікавих» файлів містить такі шаблони пошуку:
"*.env*", "*metamask*", "*phantom*", "*bitcoin*", "*btc*", "*Trust*", "*phrase*", "*secret*", "*phase*", "*credential", "*profile*", "*account*", "*mnemonic*", "*seed*", "*recovery*", "*backup*", "*address*", "*keypair*", "*wallet*", "*my*", "screenshot*", "*.doc", "*.docx", "*.pdf", "*.md", "*.rtf", "*.odt", "*.xls", "*.xlsx", "*.txt", "*.ini", "*.secret", "*.json", "*.ts", "*.js", "*.csv"
Хоча цей модуль не був присутній у поточній кампанії, його було виявлено під час пошуку схожих файлів на VirusTotal. Окрім атаки коду BeaverTail на браузерні розширення для криптовалют, модуль OtterCookie також націлюється на розширення зі списку, що частково збігається зі списком криптогаманців із частини корисного навантаження BeaverTail.

Модуль криптовалюти націлений на браузери Google Chrome та Brave. Якщо в будь-якому з профілів браузера виявляються будь-які розширення, файли розширень, а також збережені дані для входу та веб-сайти завантажуються на URL-адресу сервера C2. У виявленому зразку було знайдено, URL-адреса завантаження сервера C2 була «hxxp[://]138[.]201[.]50[.]5:5961/upload».
Зразки шкідливого програмного забезпечення OtterCookie вперше були виявлені компанією NTT Security Holdings приблизно в листопаді 2024 року, що призвело до публікації статті в блозі в грудні 2024 року. Однак вважається, що шкідливе програмне забезпечення використовується приблизно з вересня 2024 року. Мотивація для використання назви OtterCookie, ймовірно, походить від ранніх зразків, які використовували вміст файлів cookie відповідей HTTP для передачі шкідливого коду, що виконується обробником відповідей. Ця функція віддаленого завантаження коду з часом розвивалася, додаючи додаткові функції.
У квітні 2025 року було зафіксовано появу додаткових модулів у коді OtterCookie та використання сервера C2, переважно для завантаження базової конфігурації OtterCookie і передачі викрадених даних.

OtterCookie еволюціонував від початкових базових можливостей збору даних до більш модульної конструкції для крадіжки даних та методів віддаленого виконання команд. Модулі зберігаються в рядках OtterCookie та виконуються на льоту.
Найдавніші версії, що відповідають тому, що дослідники NTT називають v1 , містять код для віддаленого виконання команд (RCE) та використовують пакет socket.IO для зв’язку з сервером C2. З часом модулі OtterCookie розвивалися, додаючи код для крадіжки та завантаження файлів, з кінцевою метою крадіжки криптовалютних гаманців зі списку жорстко закодованих розширень браузера та збережених облікових даних браузера. Цільові браузери включають Brave, Google Chrome, Opera та Mozilla Firefox.
Наступна ітерація, що отримала назву v2, включала код крадіжки буфера обміну за допомогою пакета Clipboardy для надсилання вмісту буфера обміну на віддалений сервер. Ця версія також дещо інакше обробляє завантаження коду Javascript із сервера. Замість того, щоб оцінювати повернутий файл cookie заголовка як v1, сервер генерує помилку, яка обробляється обробником помилок на стороні клієнта. Обробник помилок просто передає дані відповіді на помилку до функції eval, де вона виконується. Код завантажувача малий і його легко пропустити, і разом із ризиком хибнопозитивних виявлень, це може бути причиною невдалого виявлення завантажувачів OtterCookie на VirusTotal.


Варіант v3, який спостерігався у лютому 2025 року, включає функцію для надсилання певних файлів (документів, файлів зображень та файлів, пов’язаних з криптовалютою) на сервер C2. OtterCookie v4, який спостерігається з квітня 2025 року, містить код виявлення віртуального середовища, який допомагає зловмисникам розрізняти журнали з пісочниць від журналів фактичних заражень, що свідчить про зосередженість на уникненні аналізу. Код також містить деякі функції захисту від налагодження та реєстрації.
Варіант v4 покращує код попередньої версії та оновлює метод крадіжки вмісту буфера обміну. Він більше не використовує бібліотеку Clipboardy, а натомість використовує стандартні команди macOS або Windows для отримання вмісту буфера обміну.
Важливо зазначити, що з часом різниця між BeaverTail та OtterCookie розмилася, і в деяких атаках їхній код об’єднувався в один інструмент.
У серпні 2025 року зафіксовано кампанію з використанням найновішої версії OtterCookie (v5): до складу додається модуль кейлоггера, який робить скріншоти й відправляє їх разом із записами натискань клавіш на сервер C2.

Початковим вектором зараження був модифікований додаток Chessfi, розміщений на Bitbucket. ChessFi — це багатокористувацька шахова платформа на базі web3, де гравці можуть змагатися один з одним і робити ставки в криптовалюті на результат своїх матчів. Вибір додатка, пов’язаного з криптовалютою, для заманювання жертв узгоджується з попередніми повідомленнями про атаку на Famous Chollima.
Першою ознакою атаки стало встановлення користувачем вихідного коду програми. Виходячи з назви папки проєкту, з високою ймовірністю зловмисник звернувся до жертви через платформу фріланс-маркетплейсу Fiverr, що відповідає раніше зафіксованим випадкам. Під час аналізу подібних зразків було знайдено також репозиторії коду, передані жертві як вкладення у спілкуванні через Discord.
Процес зараження розпочався з запуску жертвою Git для клонування репозиторію:

У розділі «Розробка» документа readme програми наведено інструкції для розробників щодо встановлення та запуску проекту. Після клонування репозиторію зазначено, що користувачам слід запустити npm install для встановлення залежностей, які в цій кампанії також включали шкідливий npm-пакет під назвою «node-nvm-ssh».

Під час встановлення залежностей шкідливий пакет завантажується з репозиторію та встановлюється. Інсталятор npm аналізує файл package.json шкідливого пакета та знаходить інструкції для виконання команд після встановлення. Це виконується шляхом розбору значення «postinstall» об’єкта JSON з назвою «scripts». На перший погляд здається, що пост-інсталяційні скрипти призначені для запуску тестів, трансляції файлів TypeScript у Java-скрипти та, можливо, запуску інших тестових скриптів.

Однак інструкція встановлення модуля package.json «npm run skip» змушує npm викликати команду node test/fixtures/eval, вказану у значенні «skip». Стандартні правила завантаження node.js намагатимуться завантажити кілька імен файлів, якщо жодне з них не згадано конкретно, одним з яких є index.js.
Вміст test/fixtures/eval/index.js містить код для створення дочірнього процесу за допомогою файлу “test/fixtures/eval/node_modules/file15.js”.


Зрештою, file15.js завантажує файл test.list, який є остаточним корисним навантаженням. Цей дещо складний процес отримання коду корисного навантаження значно ускладнює для нічого не підозрюючого розробника програмного забезпечення виявлення того, що встановлення програми Chessfi зрештою призведе до виконання шкідливого коду.
За допомогою файлу test.list було виявлено останній шматок пазлу про виконання шкідливого коду: файл має довжину понад 100 КБ і обфускований за допомогою Obfuscator.io. На щастя, обфускація не була налаштована так, щоб ускладнити аналіз; за допомогою деобфускатора та LLM більшість функцій було деобфусковано й виявлено поєднання BeaverTail та OtterCookie.
Здається, що в коді є дві окремі частини. Перша пов’язана з BeaverTail, включаючи перерахування різних профілів та розширень браузера, а також завантаження дистрибутива Python та корисного навантаження клієнта Python із сервера C2 «23.227.202[.]244» з використанням спільного TCP-порту 1224 для BeaverTail/InvisibleFerret. Друга частина коду пов’язана з OtterCookie.
Частина BeaverTail починається з функції, яка вимикає ведення журналу консолі, переходячи до завантаження необхідних модулів та виклику функцій для крадіжки даних зі списку розширень браузера, криптовалютних гаманців та сховища облікових даних браузера.

BeaverTail спостерігається щонайменше з травня 2023 року, і спочатку це був відносно невеликий компонент завантажувача, розроблений для включення до Javascript-додатків на базі Node.js. BeaverTail також використовувався в атаках на ланцюг поставок, що впливали на пакети в репозиторії пакетів NPM, що було детально розглянуто в попередньому дослідженні та виходить за рамки цієї публікації.
З самого початку BeaverTail підтримував Windows, Linux та macOS, використовуючи той факт, що Node.js-додатки можна запускати на різних платформах операційних систем.

Іншими основними функціями BeaverTail є завантаження модулів викрадача Python-кодів InvisibleFerret та встановлення модуля віддаленого доступу, зазвичай клієнта AnyDesk, який дозволяє зловмиснику дистанційно отримати контроль над зараженою машиною. Крадіжка інформації та віддалений доступ залишаються поширеними операційними методами BeaverTail протягом тривалого часу.
Невдовзі після виявлення перших зразків у червні 2023 року, BeaverTail почав використовувати просте кодування рядків у base64 та перейменування змінних, щоб ускладнити виявлення та аналіз. Це також включало схему, яка використовувалася для кодування URL-адреси C2 як перетасованого рядка, фрагменти якого декодувалися окремо в base64, а потім об’єднувалися в правильному порядку для генерації кінцевої URL-адреси.

Хоча BeaverTail зазвичай пишеться на Javascript, Talos також виявив кілька IP-адрес серверів Javascript C2. Вони були спільними для варіантів бінарних кодів, скомпільованих на C++, створених за допомогою фреймворку Qt .

Від початку існування в середині 2023 року до останнього кварталу 2024 року шаблони URL-адрес BeaverTail C2 стабілізувалися навколо найчастіше використовуваних TCP-портів 1224 та 1244, а не порту 3306, який використовувався ранніми варіантами. Схоже, що зловмисники швидко зрозуміли, що більшість інсталяцій Windows не постачаються з попередньо встановленими інтерпретаторами Python, як дистрибутиви Linux та macOS. Щоб вирішити цю проблему, вони включили код, який встановлює дистрибутив Python, зазвичай з URL-шляху «/pdown», необхідного для запуску модулів Python InvisibleFerret. Цей TTP залишається донині.
Що стосується уникнення виявлення, Famous Chollima використовує кілька методів обфускації коду, найчастіше використовуючи різні конфігурації безкоштовного інструменту Javascript Obfuscator.io, що ускладнює аналіз і особливо виявлення шкідливого коду.
Окрім обфускації коду Javascript, вони також регулярно використовують різні режими обфускації завантажених модулів на основі XOR. Модулі Python InvisibleFerret з XOR починаються з унікального рядка, що присвоюється користувачеві, за яким йде рядок, закодований у зворотному base64, який містить кінцевий код модуля Python, який також можна обфускувати за допомогою XOR.

На щастя, використовуючи комбінацію інструменту деобфускації та LLM для перейменування змінних та декодування рядків, закодованих у base64, можна відносно легко аналізувати нові зразки. Однак, темпи роботи груп, що приписуються Famous Chollima, високі, а виявлення абсолютно нових зразків та коду на VirusTotal залишається ненадійним, що дає зловмисникам достатньо часу для успішної атаки на деяких жертв.
Усі додаткові модулі, присутні в коді OtterCookie, добре відповідають функціональності, яка традиційно асоціюється з InvisibleFerret та його модулями на основі Python, а також деяким частинам коду BeaverTail. Таке перенесення функціональності на Javascript може дозволити зловмисникам позбутися залежності від коду Python, усуваючи необхідність встановлення повних дистрибутивів Python на Windows.

Атаки з використанням BeaverTail та OtterCookie показують, що зловмисники перейшли до модульних, мультиплатформних інструментів: вони крадуть облікові дані й криптоактиви, фіксують натискання клавіш і скріншоти, а заразом можуть виконувати віддалені команди — часто через троянізовані npm-пакети або заражені розширення. Це ускладнює виявлення й підвищує ризики для розробників і DevOps-середовищ; основна оборона — обережність з джерелами ПО, ізоляція dev-середовищ і постійний моніторинг поведінки процесів.