Блог ·
Збіг, який відмовляється бути певним
Чотири факти з чотирьох джерел, тримані нарізно. Чому запис KEV ніколи не підвищує тяжкості й чому лише обмежений діапазон версій справді щось означає.
Автор: Provibr
Сканер банерів читає SSH-2.0-OpenSSH_8.9p1 із порту й записує продукт і версію. Стрічка вразливостей каже, що діапазон версій цього продукту має відому проблему. Скласти ці двоє докупи є одним рядком коду й одним із найлегших способів побудувати екран безпеки, якому за місяць уже ніхто не довірятиме.
Причина в тому, що ці дві фрази не є твердженнями одного роду. Одне є вимірюванням служби, яка може вам брехати. Друге є твердженням сторонньої особи про діапазон версій, який, можливо, написали ще до того, як зʼявилося виправлення. Екран, що подає їх як одне число, викинув саме те, що дало б клієнтові змогу вирішити, що робити.
Чотири факти з чотирьох джерел
У фразі ця машина має CVE-1234 міститься чотири окремі твердження.
- Досяжність виміряна. У певну мить встановилося зʼєднання TCP.
- Версія виведена. Ми вирізали ознаку з привітання, і службу можна налаштувати казати будь-що, і дистрибутив міг перенести латку, не змінивши номера.
- Бюлетень належить комусь іншому. NVD каже, що діапазон версій продукту вражений.
- Активно експлуатується є вже третьою стороною. CISA каже, що це CVE вживають у дикій природі.
Це лишаються чотири стовпці. Перемножити їх у бал є саме тим позбавленим змісту складником, який специфікація цієї можливості забороняє, а вважати запис у каталозі експлуатованих вразливостей підвищенням тяжкості є тією самою помилкою в малому.
Тому запис KEV ніколи не підвищує тяжкості. Тяжкість походить із базового бала CVSS і ні з чого іншого, певність лишається низькою, бо доказом є банер, а експлуатація є власним стовпцем із трьома станами: так, ні й незастосовно для знахідок, які взагалі не спираються на бюлетень. Виміряно на пробних даних: бюлетень Exim із CVSS 9,8 є критичним і несе познаку KEV; бюлетень OpenSSH із 8,1 є високим і не несе жодної. Той із 9,8 є критичним через свій бал, а не через познаку.
Каталог до того ж за побудовою не може дати збігу власними силами. Він несе ідентифікатор CVE, постачальника, назву продукту й дату, і жодних діапазонів версій. Прикласти Apache HTTP Server до банера означало б угадувати. Він лише коли-не-коли ставить познаку на бюлетень, який NVD уже привʼязав до діапазону версій.
Стрічки є платформними таблицями
Обидві стрічки живуть у таблицях без стовпця організації. CVE не належить нікому: це не персональні дані, це не дані клієнтки, і це той самий рядок для кожного облікового запису на платформі. Тому його немає ні в очищенні, що йде при закритті організації, ні у вивантаженні персональних даних. Звʼязок між знахідкою та бюлетенем належить клієнтові, і він є в обох.
Збирач має дозвільний перелік за вузлом, а не за адресою, і самі адреси стоять у коді. Робітник, що читає адресу з середовища чи з бази даних, є примітивом підробки запитів із розкладом навколо: той, хто може задати це значення, змушує наш шлюз зробити запит із нашої мережі й нашими вихідними адресами. Вузол кожної остаточної адреси теж перевіряється, тож і перенаправлення на інший вузол відхиляється, а не супроводжується.
Таблиця істинності
За назви продукту, що збігається, і правила CPE з бюлетеня є рівно три можливі відповіді, і більшість цікавих рядків дає середню.
| Спостережена версія | Правило CPE | Наслідок |
|---|---|---|
| будь-яка | назва продукту відрізняється | нічого |
| нечитна | будь-яке | можливий збіг, неперевірений |
| читна | точна версія, рівна, оновлення підходить | збіг бюлетеня |
| читна | точна версія, рівна, оновлення відрізняється | можливий збіг, неперевірений |
| читна | точна версія, нерівна | нічого |
| читна | діапазон із верхньою межею, усередині | збіг бюлетеня |
| читна | діапазон із верхньою межею, поза ним | нічого |
| читна | лише нижня межа, вище неї | можливий збіг, неперевірений |
| читна | жодних меж | можливий збіг, неперевірений |
Рахуються лише записи CPE з частиною a, від застосунку. Літера o для операційної системи чи h для обладнання почепила б Ubuntu 22.04 на банер SSH, і це саме той рід збігу, що виглядає переконливо й нічого не означає: ми бачили службу, а не систему під нею.
Рядок, про який варто сперечатися, це лише нижня межа. Правило, яке каже все від 8.0, без верхньої межі, охоплює версії, що вийшли після бюлетеня й уже розвʼязали проблему. NVD пише діапазони так, коли виправлення ще не було опубліковане, і не завжди їх потім переглядає. Наліпити таке правило на машину означало б повідомити про залатаний сервер як про вразливий, а після двох таких повідомлень клієнт учиться нехтувати цілим екраном. Неперевірений є чесною позначкою, і неперевірений не є меншим різновидом підтвердженого. Це інше твердження.
Коли один бюлетень несе десятки правил CPE, по одному на кожен уражений випуск, перемагає найсильніший наслідок. Якщо одне влучає точно, то це і є відповідь, навіть коли поряд стоїть десяток розмитих.
Переоцінка пише нову ревізію й не торкається доказу
Стрічки змінюються. NVD переглядає бал, діапазон звужується, CVE, що збігалося минулого тижня, більше не збігається. Обхід, який переоцінює відкриті знахідки проти поточних стрічок, має одне жорстке правило: він ніколи не пише й не змінює появи.
Поява є відповіддю на чи було воно о 03:14. Оновлення стрічки нічого в цьому не змінює. Змінюється висновок понад нею, і той дістає новий рядок у таблиці оцінок із власним ідентифікатором ревізії, що називає обидва знімки стрічок. Виміряно: після переміщення бюлетеня з CVSS 9,8 на 7,5 наявні рядки появ повернулися байт у байт однаковими.
Зниклий збіг закриває знахідку як closed_unverified і ніколи як resolved_verified. Друге є твердженням про вимірювання, а вимірювання не було. Змінилося наше власне виведення. Назва є цілою причиною того, що цей стан існує.
Нічого не пишеться й тоді, коли нічого не змінилося. Знімок спершу порівнюють із попереднім судженням, бо обхід, що складає рядок за кожного проходу, лишає за місяць сто двадцять однакових оцінок під кожною знахідкою, і тоді часову смугу неможливо читати.
Жодного обходу без успішної стрічки
Останній засув коштував найменше коду й запобігає найгіршому наслідкові.
Якщо жодна стрічка ніколи не була успішною, поточна ревізія бюлетенів порожня, і обхід повертається одразу, нічого не розглянувши. Без тієї перевірки він працював би, побачив би, що запит кандидатів нічого не дає, і закрив би кожну засновану на бюлетені знахідку в кожного клієнта як таку, що більше не збігається. Цілий парк став би зеленим на підставі стрічки, яка зламана.
Невдале отримання до того ж лишає попередній кеш на місці разом із власною позначкою успіху, тож два питання коли ми востаннє пробували й коли нам востаннє вдалося є двома окремими стовпцями замість одного сповненого надії.
Чого це коштує й що дає
Коштує воно того, що екран показує чимало рядків можливий збіг, неперевірений, а вони задовольняють менше, ніж число. Адміністратор мусить подивитися на один із них і вирішити, чи справді вражена версія, яку він тримає.
Дає воно те, що рядки, позначені як підтверджені, варті дії, і що кожен рядок можна розібрати на чотири факти, з яких його склали: що виміряно, що виведено, що стверджував хтось інший і чого просто не знають. Знахідка, яка не може пояснити, звідки походить кожна її частина, є знахідкою, яку хтось колись навчиться проминати.
З роботи з безпеки Provibr. Чому сканування відкритості, що читає банер, не надсилає жодного корисного навантаження, описано в сканер, який надсилає нуль байтів, а чому інцидент ніколи не закривається тишею, описано в інцидент, який не закривається на мовчанні.