Gatekeeper запускає цю перевірку автоматично, коли ви вперше відкриваєте завантажену програму, і в більшості випадків ви ніколи не бачите подробиць — з’являється діалогове вікно, ви клацаєте по ньому, готово. Ця лабораторія має на меті побачити те, що бачив Gatekeeper: який розробник підписав додаток, чи цей підпис неушкоджений, чи перевіряла його нотаріальна служба Apple і що йому дозволено робити після запуску. Кожна команда постачається разом із інструментами командного рядка Xcode (xcode-select --install, якщо ви їх ще не маєте), і кожна з них доступна лише для читання — ви перевіряєте, а не змінюєте додаток.
Сам підпис: codesign -dvvv
codesign — це інструмент Apple для створення та перевірки підписів коду. Прапор -d відображає інформацію про підписаний код на шляху, а на його сторінці довідки: «Збільшення рівнів детальності дає більше виводу» — тому -dvvv (відображення, три рівні докладності) дає вам повну картину за допомогою однієї команди:
codesign -dvvv /Applications/Example.app
# example output, trimmed to the fields that matter
Executable=/Applications/Example.app/Contents/MacOS/Example
Identifier=com.example.app
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=... flags=0x10000(runtime) hashes=...
Signature size=4741
Authority=Developer ID Application: Example Software LLC (ABCDE12345)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Team Identifier=ABCDE12345
Runtime Version=14.0.0Чотири поля для читання кожного разу. Authority — це ланцюжок сертифікатів: звичайна зовнішня програма має закінчуватися на Apple Root CA через Developer ID Certification Authority, а у верхньому рядку має бути назва розробника. Team Identifier — десятизначний ідентифікатор Apple для облікового запису розробника — значення для порівняння між програмами, які, на вашу думку, походять від однієї компанії, оскільки воно не змінюється між їхніми випусками. flags=0x10000(runtime) означає, що ввімкнено захищене середовище виконання, набір додаткових обмежень (наприклад, опір впровадженню коду в процес), які Apple вимагає для нотаріального засвідчення. А відсутність будь-якого рядка Authority взагалі — лише Signature=adhoc — означає, що програма непідписана або самопідписана без будь-якого зв’язку з Apple.
Чи збігається підпис із файлами: --verify --deep --strict
Підпис — це обіцянка щодо певного набору байтів під час підписання. --verify перевіряє, чи виконується ця обіцянка — відповідно до сторінки довідки, він підтверджує, «що код у цих шляхах підписаний, що підпис дійсний і що всі запечатані компоненти не змінені». Два додаткові прапорці мають значення для набору програм, який є каталогом, повним вкладених ресурсів, фреймворків і допоміжних виконуваних файлів, а не окремого файлу:
codesign --verify --deep --strict --verbose=2 /Applications/Example.app
/Applications/Example.app: valid on disk
/Applications/Example.app: satisfies its Designated Requirement--deep має значення, тому що, згідно зі сторінкою довідки, перевірка вкладеного вмісту за замовчуванням «обмежується неглибоким дослідженням, яке може не виявити змін у вкладеному коді» — глибокий режим рекурсивно перевіряє кожну вбудовану структуру та допоміжний інструмент, а не лише зовнішній комплект. --strict додає додаткові перевірки, які Apple вважає досить важливими, щоб їх не було ввімкнено за замовчуванням, включаючи те, що будь-яке символічне посилання всередині пакета «вказує на запечатані файли всередині пакета», відхиляючи ті, які вказують за межі програми або на щось незапечатане — відомий трюк для контрабанди непідписаного корисного навантаження в інакше законно підписаний пакет. Якщо будь-яка перевірка не вдасться, ви побачите code failed to satisfy specified code requirement або примітку з іменем того, який саме вкладений елемент не відповідає тому, що було спочатку запечатано — прочитайте цей рядок, він називає файл.
Читання прав
Права — це спеціальні дозволи, які надає програмі підпис — доступ до камери, можливість доступу до мережі без ізольованого програмного середовища, вимкнення перевірки бібліотеки тощо. codesign -d --entitlements - витягує їх; відповідно до сторінки довідки, «Вбудовані дані про права буде витягнуто так само та записано» за вказаним шляхом, а - означає стандартний вихід:
codesign -d --entitlements - /Applications/Example.app
# example output, trimmed
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>Більшість дозволів нічим не примітні та відповідають тому, що очевидно потрібно програмі — програма для відеодзвінків, яка запитує доступ до камери, не є знахідкою. На якому варто зупинитися, це disable-library-validation: це означає, що програма завантажуватиме код із-за меж свого підписаного комплекту, що є нормальною потребою для програмного забезпечення на основі плагінів і ширших дверей, ніж вимагає більшість програм. Це деталь, на яку слід звернути увагу, а не автоматичний червоний прапорець, і це саме та деталь, яку ви не можете побачити без запитань.
Нотаріальна служба Apple справді перевірила це: spctl і степлер
Дійсний підпис лише доводить, що програма не була змінена з моменту її підписання розробником — вона нічого не говорить про те, чи дивилася її Apple. Саме це додає нотаріальне засвідчення. У власній документації Apple описано, що автоматизована нотаріальна служба сканує «ваше програмне забезпечення на наявність шкідливих компонентів, перевіряє наявність проблем із підписом коду та швидко повертає вам результати». Коли він пройде, «нотаріальна служба генерує квиток, який ви можете прикріпити до свого програмного забезпечення; нотаріальна служба також публікує цей квиток онлайн, де Gatekeeper може його знайти».
spctl --assess — це практичний спосіб запитати вердикт у механізму політики Gatekeeper, а не робити висновки самостійно. На його сторінці довідки --assess «виконує оцінку наданих файлів», а -v / --verbose, повторювані для більш детальної інформації, описано просто як запит на «більш детальний вивід»:
spctl --assess -vv /Applications/Example.app
/Applications/Example.app: accepted
source=Notarized Developer IDsource=Notarized Developer ID — це результат, який ви хочете побачити — це означає, що Gatekeeper знайшов дійсний підпис ідентифікатора розробника та нотаріальне засвідчення, незалежно від того, чи прикріплено цей квиток до програми, чи знайдено в Інтернеті. Результат source=Unnotarized Developer ID означає, що додаток підписано, але Apple не завірила (або ще не) нотаріально його, а рівний rejected означає, що Gatekeeper заблокує його запуск у конфігурації за замовчуванням.
Щоб перевірити скріпку конкретно, xcrun stapler validate шукає квиток, фізично приєднаний до програми, замість того, щоб просити Gatekeeper шукати його в Інтернеті — корисно для підтвердження того, що програма все одно правильно оцінюватиметься без підключення до Інтернету взагалі:
xcrun stapler validate /Applications/Example.app
Processing: /Applications/Example.app
The validate action worked!Прапор карантину: звідки береться перевірка першого запуску
У посібнику з безпеки платформи Apple пояснюється, що «Gatekeeper також відстежує походження файлів, створених завантаженим програмним забезпеченням» і «запитує схвалення користувача перед першим відкриттям завантаженого програмного забезпечення». Механізмом, що стоїть за цим, є розширений атрибут com.apple.quarantine, який Safari, Mail та інші програми додають до всього, що вони зберігають із мережі. xattr -l перераховує його, і згідно зі сторінкою довідки ця опція «спричиняє відображення як імен атрибутів, так і відповідних значень»:
xattr -l ~/Downloads/Example.dmg
com.apple.quarantine: 0081;65e1a2b3;Safari;Відсутність вихідних даних означає, що файл не має позначки карантину — або він був створений локально, надійшов шляхом, у якому не встановлено атрибут (деякі інструменти архівування та менеджери пакунків пропускають його), або позначку було видалено вручну за допомогою xattr -d com.apple.quarantine. Про останній випадок варто знати з іншої причини: це задокументований спосіб, яким люди повністю обходять перевірку Gatekeeper під час першого запуску файлів, яким вони довіряють або вважають, що вони довіряють, і про це варто подумати, а не вставляти з незнайомого набору інструкцій терміналу.
Спрацьоване порівняння: дві програми, які претендують на одного розробника
Конкретний спосіб використати все це разом: скажімо, у вас є дві копії програми, які стверджують, що належать одній компанії, одна з власного сайту розробника, а друга – за посиланням, яке вам хтось надіслав. Запустіть codesign -dvvv на обох і порівняйте рядок Team Identifier — це рядок із десяти символів, прив’язаний до певного облікового запису розробника Apple, і, на відміну від відображуваного імені чи ідентифікатора комплекту, це не те, що друга сторона може випадково відтворити без доступу до сертифіката підпису цього облікового запису. Якщо дві копії показують різні ідентифікатори команди, ви не переглядаєте дві збірки однієї програми; ви дивитесь на двох різних підписантів, один із яких не є тим, хто зазначений у завантаженні. Додайте spctl --assess -vv на підозрілій копії — невідповідність або відсутність джерела нотаріального засвідчення на копії, яка нібито ідентична нотаріально завіреному оригіналу, є підтвердженням, а не просто підказкою.
Читання повної картини та фактичних червоних прапорів
- Немає жодного ланцюжка
Authorityабо ланцюга, який не закінчується на Apple Root CA — за програмою не стоїть ідентифікаційна інформація відповідального розробника. codesign --verifyне вдається, особливо з повідомленням із назвою конкретного вкладеного файлу — щось усередині пакету змінилося після його підписання.spctl --assessповертаєrejected, або ідентифікатор команди вcodesign -dvvvне відповідає розробнику, якого ви очікуєте для цього продукту.- Позначка карантину, яку було явно знято з файлу, який ви не завантажували самостійно, або який надійшов через незвичайний канал (сценарій, вкладення електронної пошти, перейменовані так, щоб вони виглядали якось інакше).
- Повністю відкриті повноваження — повний доступ до диска, вимкнена перевірка бібліотеки, необмежений доступ до мережі — у програмі, для якої вони явно не потрібні.
Жодна з цих перевірок не розглядає, що насправді робить програма після того, як вона запущена та підключена до мережі — це інше питання, на яке можна відповісти, спостерігаючи за її трафіком, а не за її підписом. Чистий підпис і дійсне нотаріальне завірення є справжньою, значущою підлогою: кажуть, що Apple бачила саме цей набір байтів і під час перевірки не виявила проблем із підписом коду. Вони є початком довіри до програми, а не кінцем.
Яке місце тут посідають FireAI та HisnLabs
A clean signature and a stapled ticket say an app hasn’t been tampered with since Apple checked it — they say nothing about what it connects to afterward, which is the question FireAI’s per-app rules and on-device review are built to keep answering, signature by signature, connection by connection.
FireAI — це власний продукт HisnLabs: ШІ-фаєрвол, який працює безпосередньо на вашому Mac. Він показує простою мовою кожне з’єднання, яке встановлюють ваші застосунки, і дає вам вирішувати, що покидає ваш Mac, — його ШІ працює локально, тож ваш трафік ніколи не надсилається ні нам, ні будь-кому іншому. Команда дослідників безпеки HisnLabs — саме вона підтримує точність цих рішень: каталогізує, які домени є звичайною телеметрією, а які — справжнім сервісом, відстежує країну та мережу за з’єднанням і навчає локальну модель (функцію Autopilot) на реальних шаблонах трафіку — і нічого з цього не покидає ваш Mac.
Ви можете почитати про технічні рішення, що лежать в його основі, або спробувати FireAI протягом 17 днів на сторінці FireAI від HisnLabs.
