Кампания Contagious Interview, которую эксперты связывают с Северной Кореей (DPRK), продолжает активно атаковать разработчиков программного обеспечения. Злоумышленники маскируются под рекрутеров, предлагая фиктивные технические собеседования и прося провести код-ревью проектов на GitHub. Новый метод в их арсенале использует файлы задач Microsoft Visual Studio Code для автоматического выполнения вредоносного кода при открытии проекта. Этот вектор атаки демонстрирует эволюцию тактик группы, направленную на максимальное упрощение процесса заражения.
Описание
Исследователи из различных компаний информационной безопасности ранее задокументировали, как кампания использует файлы ".vscode/tasks.json" для развертывания вредоносных программ, таких как загрузчик BeaverTail и бэкдор InvisibleFerret. Новый отчет углубляет эти наблюдения, предоставляя дополнительные данные для отслеживания активности и предлагая методы обнаружения.
Механизм атаки через задачи VS Code
Функция задач в Visual Studio Code предназначена для автоматизации рабочих процессов разработчиков. Конфигурация "runOn: folderOpen" позволяет задаче выполниться автоматически при открытии рабочей области в редакторе. Эту легитимную функцию злоумышленники подменяют, размещая в "tasks.json" команды для выполнения вредоносных скриптов. При этом свойство "presentation" может быть настроено для скрытия активности командной оболочки, оставляя жертву в неведении.
Теоретически, для выполнения задачи требуется одноразовое подтверждение доверия к рабочей области от пользователя. Однако в контексте собеседования социальная инженерия легко убеждает жертву нажать нужную кнопку. Более того, если злоумышленник получит доступ к уже доверенному репозиторию, он может добавить вредоносную задачу через новый коммит. При следующем открытии проекта эта задача выполнится автоматически, без каких-либо дополнительных запросов.
Отслеживание активности с помощью GitHub Code Search
GitHub Code Search оказался эффективным инструментом для выявления репозиториев, использующих эту технику. Специалисты разработали ряд запросов для поиска подозрительных файлов "tasks.json". Базовый запрос ищет команды, которые напрямую запускают "curl" или "wget" для загрузки и выполнения полезной нагрузки (payload). Этот подход позволяет находить новые репозитории, связанные с известными аккаунтами-марионетками, и выявлять новые.
В результатах поиска были обнаружены интересные методы маскировки. Например, в некоторых файлах вредоносные команды были скрыты за огромным количеством пробелов, что выталкивало их за правый край экрана при обычном просмотре. Обнаружить такой трюк можно было только по появлению горизонтальной полосы прокрутки.
Хотя в большинстве случаев для размещения вредоносных скриптов используются домены платформы Vercel, исследователи также выявили применение альтернативных ресурсов. Среди них "vscodeconfig[.]com", "regioncheck[.]xyz" и "vscode-load[.]onrender[.]com".
Маскировка под легитимные файлы
Кампания активно использует технику сокрытия обфусцированного JavaScript-кода в файлах с неожиданными расширениями. Полезная нагрузка может быть спрятана внутри файлов шрифтов (".woff", ".woff2"), изображений (".jpeg", ".svg", ".png"), конфигурационных файлов или даже словарей для проверки орфографии (".dict"). Поскольку Node.js выполняет код независимо от расширения файла, такая маскировка эффективно обманывает как разработчиков, так и некоторые системы защиты.
Например, в одном из репозиториев задача запускала команду "node .vscode/spellright.dict", где файл ".dict" на самом деле содержал вредоносный JavaScript. Другие образцы показывали выполнение кода из файлов, маскирующихся под веб-шрифты или логотипы.
Новый вредоносный пакет NPM
В ходе анализа был обнаружен новый вектор, связанный с установкой вредоносного пакета через менеджер зависимостей NPM. В одном из репозиториев, представляющемся тестовым заданием по разработке веб-приложения, файл "tasks.json" запускал установку зависимостей. Среди них находился пакет "jsonwebauth", опубликованный за несколько дней до анализа.
Изучение кода пакета выявило явные признаки злонамеренности. Основной файл "lserver.js" размером 326 КБ содержал скрытую вредоносную нагрузку. Пакет уже был внесен в публичные трекеры вредоносных пакетов NPM, связанных с северокорейскими группами. Поиск по GitHub показал, что как минимум два других репозитория использовали этот пакет.
Любопытной деталью стало также обнаружение в том же проекте открытых учетных данных для базы данных MongoDB. Уникальное имя пользователя может служить индикатором для отслеживания других потенциально скомпрометированных проектов.
Рекомендации по защите и обнаружению
Эксперты предлагают несколько практических шагов для снижения рисков. Во-первых, в настройках VS Code можно отключить автоматический запуск задач, установив параметр "task.allowAutomaticTasks" в значение "off". Во-вторых, для первоначального изучения незнакомых репозиториев стоит использовать веб-редактор GitHub (открывается клавишей "."), который не имеет доступа к командной оболочке. В-третьих, следует крайне осторожно открывать в локальном VS Code репозитории, полученные в рамках собеседований, и всегда проверять наличие подозрительного файла "tasks.json".
С точки зрения обнаружения атак специалисты рекомендуют мониторить несколько ключевых событий. К ним относятся запуск дочерних процессов VS Code, которые выполняют "curl", "wget" или команды оболочки вскоре после старта редактора. Также важно отслеживать случаи, когда Node.js исполняет файлы с нехарактерными расширениями, например, ".woff" или ".png". Сетевой трафик, исходящий от процесса VS Code к доменам Vercel или сервисам хранения JSON, также является сильным индикатором компрометации.
Эволюция кампании Contagious Interview в сторону эксплуатации легитимных функций инструментов разработки подчеркивает необходимость повышенной бдительности. Использование функций автоматизации в популярных средах разработки открывает новые возможности для злоумышленников, стремящихся к скрытному и эффективному заражению целей.
Индикаторы компрометации
Domains
- api-server-mocha.vercel.app
- brantwork.vercel.app
- codeviewer-fawn.vercel.app
- codeviewer-three.vercel.app
- coreviewer.vercel.app
- editorsettings.vercel.app
- isvalid-region.vercel.app
- isvalid-regions.vercel.app
- jerryfox-platform.vercel.app
- tailwind-version-four.vercel.app
- task-hrec.vercel.app
- thopywork.vercel.app
- topeupwork.gmail.com
- vscode-bootstrapper.vercel.app
- vscode-config.vercel.app
- vscode-config-setting.vercel.app
- vscode-config-settings.vercel.app
- vscode-helper-132.vercel.app
- vscode-helper171.vercel.app
- vscode-helper171-ruby.vercel.app
- vscode-lnc.vercel.app
- vscode-load.onrender.com
- vscode-load-config.vercel.app
- vscode-project-setting.vercel.app
- vscode-settings-bootstrap.vercel.app
- vscode-settings-config.vercel.app
- vscodesettingstask.vercel.app
- vscode-toolkit-bootstrap.vercel.app
- www.regioncheck.xyz
- www.vscodeconfig.com
Commit Author Emails
- 007anshumanaj@gmail.com
- 33538982+andreibesleaga@users.noreply.github.com
- 34521427+eastmade@users.noreply.github.com
- 97181033+VitthalGund@users.noreply.github.com
- alexandersmir68@outlook.com
- alexcox052595@gmail.com
- aman.jaiswal@web3paymentsolutions.io
- amitmanojgaikwad@gmail.com
- andreibalteanu2@gmail.com
- andrew@koinos.us
- andrew_watson@koinos.us
- arielmonster99@gmail.com
- brahmabit.m@gmail.com
- bulat@parity.io
- chaley@gmail.com
- dapanchal2506@gmail.com
- davidexpert1233@hotmail.com
- desarrollovba@gmail.com
- dev_group@outlook.com
- ellisfleming574@gmail.com
- eros.fabrici@gmail.com
- ethvault20251129@outlook.com
- ezraloomis.gears@gmail.com
- ferexmoto6@gmail.com
- gorakh626@gmail.com
- harry.work206@gmail.com
- huicanvie2014@gmail.com
- j.ames90@hotmail.com
- jackjhon1997917@gmail.com
- Jonathan.daniel.ag1230@gmail.com
- justinjinaz@gmail.com
- kblucky0219@proton.me
- kenedyleon350@gmail.com
- leandro@kasta.io
- lukasmuller_0925@outlook.com
- maqsoodssyasirss@gmail.com
- matsarello@mail.ru
- michalk001126@gmail.com
- myselfmail0301@gmail.com
- nelsonher019@gmail.com
- pe699674@gmail.com
- phamminh1309@gmail.com
- philip@cryptoasis.com
- rares.stanciu@outlook.com
- reslalinssmok@gmail.com
- rodrigogrande1@hotmail.com
- sethnikhil74@gmail.com
- shrisrivastava2@gmail.com
- smartpayauthor@gmail.com
- suportemtng@gmail.com
- suyog.ep@gmail.com
- thedeepak1357@gmail.com
- vappstore2016@gmail.com
- viacheslavdanilov889@gmail.com
- vyommodi@Vyoms-MacBook-Air.local
- yosket87@gmail.com
GitHub Personas
- 0x003-copia
- 1alinaderi
- adamrefaey
- adity-design
- AKJ-0483
- Alexcox8
- alex-sumner
- altovisual
- Amanjaiswalweb3payments
- ameeetgaikwad
- Andre1917
- andreibesleaga
- Aneesh495
- Anshuman-Jha
- apelsoczi
- ArnoldEsquivel
- awa-si
- BalteanuAndrei709
- bnwgsc
- brahmabit
- bsai
- ChainEmpire
- chalamsanju
- charumehta0215
- CodeByEvans
- codehome0301
- conqryash007
- COZYTECH
- CrazyDev13
- cwchuca-dev
- DAP2506
- DarkHorse9999
- David1Savitsky
- DavidMoura07
- deepakgudla
- demmojo
- Devba
- devthedeveloper
- dikshith-shetty
- djeday123
- dmbruno
- eastmade
- eferos93
- emigimenezj
- Emmanuel-bot-rgb
- ffrizzo
- forward2220
- Funkedup007
- furkanulucay
- goldendragon68
- goldenfinix68
- gorakhjoshi
- helidonashabani
- HOLDAR123
- huicanvie
- ihzhatamamy
- imail2pankaj
- IonPostolache
- ironforgecoplace
- ironforgedevspace
- Jake3450
- jjin43
- jpoullet2000
- komangmahendra
- kumarks
- lake-2024
- leandrosoaresdesouza
- leecarney94
- lionguru
- liurialves
- Luckystar483
- MahnoorKhushbakht
- marcinbodnar
- markomilivojevic
- MentarisHub121
- metawake
- motia
- mounabeldi
- nelsondev19
- nicksmarton
- nifeesleman
- nikkhielseath
- niyathi-ramesh
- prahaladbelavadi
- punesh12
- Raghupathi1996
- ramkrishnakuldeep
- rcstanciu
- ricardomartins9899
- Roberto328
- rodrigogz64
- rohitmaheshwari
- RuannCarlos
- rustkas
- ryon-business
- saeid-shoja
- samsuladry
- samuelmeadowbiankah
- Sandeepreddyr12
- sergey-belov-golang
- SettleMint-Tech-Hub5
- shanfei
- sharaalfa
- sharmapranay38
- SharoonIlyas
- sherbek-coder
- shri33
- shubham5080
- Skilltest-png
- Skillverifier834
- sky-cook
- SmartPay991
- softwareSpace203
- SolutionsDevop
- SoulSej10
- sstefdev
- suyx
- swaparup36
- ta3pks
- tayyabbabar2001
- technical-members
- tomasbecher
- Trustledgerlabs-hash
- TSGP202
- TsionTesfaye
- ubunturoxshacker
- user2745
- usmankhan16677
- vb352
- veneliteus-dev
- viacheslavdanilov889-blip
- VitthalGund
- vnvstore
- vvayffaring
- Vynlence-Tech
- W3-Social
- XanDev3
- xdrnc
- xvillarroel
- yenthanh
- yosket
- yuvraj-softnear
- zunayedology
Associated Repositories
- 0x003-copia/Copia-nft_metaverse_game_platform
- 1alinaderi/test_demo
- adamrefaey/cs-eco-mvp
- adity-design/Assessment
- AKJ-0483/student-system
- alex-sumner/challenge
- altovisual/SMART
- Andre1917/challenge
- andreibesleaga/smsf
- Aneesh495/DeFi-Property
- Anshuman-Jha/Toku_Assestment
- apelsoczi/csecomvp
- ArnoldEsquivel/best-city436-poc
- awa-si/NFT_Project
- BalteanuAndrei709/Multi-test-6
- brahmabit/be_challenge_blockchain
- bsai/cal-eco-platform
- ChainEmpire/poker_top
- chalamsanju/defi-wallet-test
- charumehta0215/real-estate-rental
- CodeByEvans/Frontend-Test-Assessment
- conqryash007/solidity-challenge
- COZYTECH/CHALLENGE
- CrazyDev13/school-management
- cwchuca-dev/goldencity
- DAP2506/dental-clinic-mgmt
- DAP2506/thirdweb-skill-test
- David1Savitsky/cal-eco-platform
- David1Savitsky/cal-eco-platform2
- DavidMoura07/linkfi
- deepakgudla/healthcare-backend-test
- demmojo/test-mtng-active-workplaces-3
- Devba/lmng-top-
- devthedeveloper/w3glpop
- dikshith-shetty/test9
- djeday123/test_repo1
- dmbruno/card-activity
- eastmade/web3project-momo-token
- eferos93/blockchain_api
- eferos93/test4
- emigimenezj/solice2021-school-management-system
- ffrizzo/test-demo-solice
- forward2220/airdrop-nft-smartcontract
- forward2220/NFT_Project
- forward2220/SmartContract
- furkanulucay/student-management-system-challange
- goldendragon68/Bullana
- goldendragon68/CryptoKet-Smart-Contracts
- goldendragon68/NFT-Marketplace
- helidonashabani/student-management
- HOLDAR123/cal-eco-platform
- huicanvie/CanvieApiTest
- ihzhatamamy/-MagicDoor_Property_Rental
- imail2pankaj/test-mtng-active-workplaces-2
- IonPostolache/GoldenCity
- jjin43/invelo_assessment
- jpoullet2000/ethvault_staking_project
- komangmahendra/rental-prop-task
- kumarks/corex_teset
- lake-2024/card-activity
- leandrosoaresdesouza/test
- leecarney94/tokentradingdapp
- liurialves/test-mtng-active-workplaces-3
- MahnoorKhushbakht/test-assesment
- marcinbodnar/14
- markomilivojevic/ethvault_staking
- MentarisHub121/TokenPresaleApp
- metawake/node-task-test
- motia/GoldenCity
- mounabeldi/challenge
- nelsondev19/defi-property
- nicksmarton/felina
- nifeesleman/TokenPresaleDApp
- niyathi-ramesh/test_demo
- prahaladbelavadi/CoinLocatorDemo
- punesh12/student-management-skill-test
- Raghupathi1996/ClassRoomAssignment
- ramkrishnakuldeep/react-test
- ricardomartins9899/SmartPay-Demo
- Roberto328/TokenPresaleDApp
- rodrigogz64/MagicDoor-Property-Rental-Platform
- rohitmaheshwari/school-management-system
- RuannCarlos/go-microservice-test
- rustkas/cal-eco-platform
- ryon-business/Promoting-DApp
- saeid-shoja/golden-city
- samsuladry/techchainai-rental
- samuelmeadowbiankah/felina
- Sandeepreddyr12/demo-version
- sergey-belov-golang/golang-skill-test
- SettleMint-Tech-Hub5/SettleMint_Platform
- shanfei/golden-city
- sharaalfa/test-mtng-active-workplaces-1
- sharmapranay38/new_age_blockchain
- SharoonIlyas/ethvault_platform
- sherbek-coder/cal-eco-platform
- sherbek-coder/SCAM_PROJECT_BE_CAREFUL
- shri33/Crypto-Trading-Platform
- shubham5080/w3glpop
- Skilltest-png/mtng-workplaces-project
- Skilltest-png/test-mtng-C
- Skilltest-png/test-mtng-go
- Skilltest-png/test-mtng-javascript
- Skilltest-png/test-mtng-python
- Skilltest-png/test-mtng-rust
- sky-cook/tokentradingdapp
- SmartPay991/Demo
- softwareSpace203/skill-test
- SolutionsDevop/BestCity-Project
- SoulSej10/react-node-takehome
- sstefdev/test-mtng-active-workplaces-2
- suyx/spacetime_test
- swaparup36/assignment-backend-developer
- ta3pks/Decentralized-Social
- tayyabbabar2001/school-mgmt-backend
- technical-members/RealFi-Hub
- tomasbecher/SoliceTest
- Trustledgerlabs-hash/Token-Presale-dApp
- TSGP202/skill-test
- TsionTesfaye/assignment
- ubunturoxshacker/test
- user2745/dev-test-kamto-kionos
- usmankhan16677/messageforge
- vb352/koinos-assessment
- veneliteus-dev/arbitrage-bot-contract
- veneliteus-dev/casino-game
- veneliteus-dev/exchange-backend
- VitthalGund/Koinos-Test
- vnvstore/funtico-labs-assessment-15
- vvayffaring/NFT_Project
- Vynlence-Tech/NFT-Platform
- W3-Social/social-app-mvp
- XanDev3/emrit-take-home
- xdrnc/skill-test
- xvillarroel/backend-skill-test-xavier-villarroel
- yuvraj-softnear/E-Commerce
- zunayedology/helio-backend-java-testing
Malicious npm Packages
- jsonwebauth
MongoDB Username
- dulanjalisenarathna93