Компанія Google зробила проактивний крок для посилення безпеки Linux, представивши атрибут counted_by для елементів гнучкого масиву.
Це вдосконалення усуває критичну вразливість у програмуванні на C, пов’язану з переповненням буфера. Зокрема із гнучкими елементами масиву, розміри яких визначаються під час виконання, повідомляє Beta News.
Переповнення буфера вже давно є джерелом проблем безпеки у розробці програмного забезпечення.
Хоча перевірка меж масиву пом’якшила деякі з цих вразливостей, гнучкі елементи масиву залишаються складним винятком. Розмір цих масивів зазвичай є непрозорим для компілятора, що ускладнює виконання перевірки меж поза функцією розподілу.
Рішення Google, реалізоване у Clang і GCC, представляє атрибут counted_by. Він явно посилається на поле, яке зберігає кількість елементів у гнучкому елементі масиву, дозволяючи перевірку меж масиву та операцій над цими масивами.
Вказаний підхід створює неявний зв’язок між елементом гнучкого масиву та полем підрахунку, підвищуючи здатність засобів перевірки меж масиву ідентифікувати потенційні переповнення.
Щоб ефективно використовувати атрибут counted_by, розробники повинні дотримуватися певних правил:
- Поле підрахунку має бути в тій самій неанонімній охоплюючій структурі, що й елемент гнучкого масиву.
- Поле підрахунку має бути встановлено перед будь-яким доступом до масиву.
- Поле масиву має містити принаймні кількість елементів, доступних у будь-який час.
- Поле підрахунку може змінюватися, але ніколи не повинно перевищувати кількість елементів, призначених спочатку.
Приклад розміщення структури з використанням атрибута counted_by виглядає таким чином:
struct foo {
size_t count;
int array[] __attribute__((counted_by(count)));
};
struct foo *foo_alloc(size_t count) {
struct foo *ptr = NULL;
size_t size = MAX(sizeof(struct foo),
offsetof(struct foo, array[0]) +
count * sizeof(p->array[0]));
ptr = calloc(1, size);
ptr->count = count;
return ptr;
}
Цей атрибут має значні наслідки для укріплення поточного проєкту, спрямованого на підвищення безпеки ядра Linux шляхом запобігання переповненню буфера в пам’яті та операціях із рядками.
Укріплення покладається на такі вбудовані функції, як __builtin_object_size() і __builtin_dynamic_object_size() для перевірки розмірів вхідних даних. Завдяки атрибуту counted_by ці функції тепер можуть точно визначати розмір елементів гнучкого масиву, що ще більше підвищує безпеку.
Атрибут counted_by, який уже використовується в ядрі Linux, виявився важливим у виявленні таких проблем, як переповнення цілих чисел, що призводить до переповнення буфера. У Google планують розширити використання до більш гнучких членів масиву та посилити його застосування у майбутніх розробках.
Читайте також на ProIT: Google розглядає можливість заблокувати користувачам Safari доступ до нових функцій ШІ.
Підписуйтеся на ProIT у Telegram, щоб не пропустити жодної публікації!