LINUX.ORG.RU

Си. Почему бы не запретить запись в стек?

 


1

4

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

#include <stdio.h>

register long unsigned rsp asm("rsp");

void print_arg(int arg) {
    ((int*)rsp)[3] = 0xBADC0DE;
    printf("arg = %x\n", arg);
}

int main(int argc, char **argv) {
    print_arg(0xF00D);
    return 0;
}

Этот код отрабатывает и не выводит ошибкок с

-fhardened -fcf-protection=full

На мой взгляд выглядит небезопасно.

Почему бы не вставлять проверки на ассемблере при записи в память, на включаемость в регион стека? Если нужно записать что то в аргумент на стеке (int), то проверку можно не вставлять. При записи по указателю, уже обязательно вставлять. Если адрес стека то ошибка. В memset проверять пересечение двух диапазонов.

Если на стек пишет fread(), то нужно вставить еще проверку на разрешающий диапазон буфера в который он пишет. Но тут компилятору нужно обязательно отслеживать откуда приходит поинтер, но если мы говорим про значения на стеке, то это не должно представлять сложности, значение всегда лежит в прошлых значениях стека, а значит вычислить размер буфера можно в момент компиляции, ну или записать в какую нибудь дополнительную переменную на стеке, если речь о сложном потоке управления и alloca.

void read_file(const char *name)
{
        char buff[999];
        FILE *f = fopen(name, "rb");
        read_block(f, buff);
}

void read_block(FILE *f, char *buff)
{
        // тут компилятор должен вывести что len(buff) == 999
        fread(buff, 1, 9999, f);
}

Что бы все идеально работало, нужно будет:

  • Пометить libc функции
  • Если функция работает со стеком как у меня в верхнем примере, но это правильное поведение, пометить и ее
  • Перекомпилировать основные библиотеки, что бы не ломать ABI можно ввести экспорт двух прототипов, с доп.значениями для проверки диапазонов и без, дублирование прототипов понадобится для малого числа функций
★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 2)

Ответ на: комментарий от anonymous

про демона на Аде :))

Когда я в 90е таскал с собой отличную книжку издательства «Мир» называвшуюся «Язык Ада» и читал ее в общественном транспорте вместо всякой «бульварной литературы» то пожилые люди на меня периодически косо смотрели. Тогда как раз православие головного мозга же в моду входило:)

watchcat382
()
Ответ на: комментарий от anonymous

«не будет ни кино, ни театра, ни книг – одно сплошное телевидение» :))

Можно подумать нынче это не так. Разве что телевидение теперь в интернете. А кино превратилось в рекламные блоки,прерываемые короткими сценами из фильма.

watchcat382
()
Ответ на: комментарий от monk

решил я тут сесть за доктора ракета… так он меня обломал. я написал функцыю с хвостовой рекурсией, но видимо где-то ошибся в логике… так он свыня зациклился, да не просто зациклился, но и подвесил мне и себя и комп… и пришлось перегрузиться.

вот и не надо нам этой вашей ридонли функциональщины.

alysnix ★★★
()
Ответ на: комментарий от anonymous

Может когда начнет ‘‘‘фляга посвистывать’’’ посвятишь свою жизнь выращиванию морковки, поверь это лучшая инвестиция в капиталистическом будущем. Так то планировалось ИИ и роботов применять для уборки снега и прочей второсортной работы, а человек мог заняться творчеством… Но рыночек порешал ‘‘‘кожаные’’’ дешевле в производстве)))

anonymous
()
Ответ на: комментарий от anonymous

Но рыночек порешал ‘‘‘кожаные’’’ дешевле в производстве)))

Насчет дешевле в производстве - не факт. Выращивание «кожаного» биоробота для выполнения второсортной работы занимает почти два десятка лет и стоит очень не дешево. Но вопреки логике их продолжают массово производить не считаясь с затратами. Ну и понятно что применение уже сильно перепроизведенных биороботов оказывается дешевле чем создание роботов из металла и кремния.

выращиванию морковки, поверь это лучшая инвестиция в капиталистическом будущем.

Инвестиции в почти любое востребованное реальное производство выгоднее именно в долгосрочной перспективе чем надувание финансовых пузырей и строительство финансовых пирамид. Производство продуктов питания будет востребовано всегда.

watchcat382
()
Последнее исправление: watchcat382 (всего исправлений: 2)
Ответ на: комментарий от watchcat382

Ну да, можно доабстрагироваться, что прошивку «черного ящика»(подсознания, рефлексы) писал не человек. И человеческой логики там очень мало )

anonymous
()
Ответ на: комментарий от rupert

Забанили, наверное.

Помню только, что в к 2022 году, он новых версий своего язычка не релизил. Его достаточно регулярно банили. Потом произошли известные события и многим стало немного не до Метапрога.

Как самого автора, так и его поделия.

Twissell
()
Ответ на: комментарий от alysnix

как русский язык. можно написать нетленное стихотворение, и невнятный бессмысленный бред параноика. и все на одном и том же языке

Невероятно захотелось изобрести язык, на котором можно написать невнятный бессмысленный бред параноика и нельзя - стихотворение.

wandrien ★★
()
Ответ на: комментарий от AntonI

там наверное, график комплекснозначный логарифма нуля (комплексного) строили. поверхностью Римана.

эдакий анекдот типа деления на 0. ненулевые делители нуля в wheel тоже смешная штука.

натыкался на какого-то изобретателя новой геометрии (очередной интеруниверсальный геометр) типа ТФПКП - пространственного комплексного переменного.

у него там дуальные паракомплексные выделенную небесную ось показывают.

осталось придумать как это остроумно применить.

в общем, вот какие глубины наших глубин.

anonymous
()
Ответ на: комментарий от MOPKOBKA

Это на винде оно может так (а зря), и то не факт. Вопрос в том, выдали тебе кусок памяти, выделенную под статик переменные, malloc’о или calloc’ом. Обращение мимо b - ошибка и любой valgrind тебе ее подсветит. Отлов записи мимо объектов должен приводить к краху программы и дебажится спец утилитами.

Truf
()
Последнее исправление: Truf (всего исправлений: 1)
Ответ на: комментарий от alysnix

брейнфак какой-нить. все уже изобретено для нас.

Он тьюринг полный, так что на нем можно написать и «невнятный бессмысленный бред параноика» и «стихотворение».

anonymous
()