LINUX.ORG.RU

Проект TrapC развивает Си-подобный язык, безопасно работающий с памятью

 , ,


1

5

Проект развивает Робин Роу (Robin Rowe), бывший профессор компьютерных наук, принимавший участие в комитетах по развитию стандартов С и С++, в своё время создавший графический редактор Cinepaint, использовавшийся при создании некоторых голливудских фильмов, и POSIX-библиотеку libunistd для Windows. Соучредителем компании Trasec выступает Габриэль Пантера (Gabrielle Pantera), занимавшая руководящий пост в компании Disney.

Из особенностей:

  • Проверки выхода за границы массива. В TrapC применяется фундаментально иной способ работы с указателями и специальный механизм перехвата ошибок на основе обработчиков исключений (trap).

  • Проверки use after free.

  • Наличие GC.

  • Выделение памяти через new. *alloc и free нет.

  • Явная инициализация нулями.

  • Строгая типизация.

Исходный код компилятора для TrapC планируют открыть в 2025 году.

>>> Подробности

★★★★★

Проверено: maxcom ()

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

На ассемблере должно обходиться, но специально я это не проверял.

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

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

Вот есть уязвимость в shell или в сервисе — это особой разницы не имеет. Сервисов много. Но то, что 90% векторов атак закрываются автоматически, заметно повышает общую безопасность.

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

Именно испортить указатель или через него получить доступ за пределами нельзя.

Если есть возможность сделать

uintptr_t i = p;
i += offset;
char *p2 = i;

то пофиг, какая там проверка.

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

Может, мы обсуждаем разные вещи. Для меня лично нет разницы на каком уровне реализована хэш-таблица. Язык, рантайм, либа – какая разница? Хэш-таблица и в Африке хэш-таблица.

Собственно, я не вижу каким образом отсутствие управления памятью вредит программам. Уже продолжительное время пишу на C и Go. Когда приходится заботиться о памяти, хотя мне не посчастливилось встретиться с этой проблемой, нужно оперировать понятиями GC. Можно считать это абстракцией, с присущими ей достоинствами и недостатками, как у любой абстракции.

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

Так нельзя сделать. Можно написать на ассемблере функцию что будет создавать нужные указатели. Эта защита похожа на адрес санитайзер.

Эти указатели не совместимы со стандартом Си. Можно сконвертировать указатель в intptr, но нельзя обратно.

Поэтому, например, нельзя сделать выравнивание указателя вот так:

p = (char*)(((intptr_t)p + 15) & ~15);

Нужно так:

p += -(intptr_t)p & 15;
jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от wandrien

Вот пример:

printf("%zu, %zu\n", sizeof(void*), sizeof(intptr_t));

В режиме с защищёнными указателями теневая часть указателя не переводится в intptr.

16, 8
jpegqs
()
Ответ на: комментарий от monk

это(большая безопасность за счёт аппаратных «издержек») преимущество «неуловимого Джо»

т.е. пока другое массовое железо отчего то заведомо дыряво то да железка страны не идущей в обозе первого мира имеет аппаратную защиту от такого рода дыр

само по себе тегированное железо не новость но в первом мире оно маргинально :)

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

былы времена когда не только функции в библиотеках но и сама машинерия «вызова» функции это кодовые вставки из «библиотек» (например железки где нет стека а организация кода полностью прерогатива софта)

зачем быть таким прибитым к «одной единственно верной» реализации?

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

Именно испортить указатель или через него получить доступ за пределами нельзя. Там аппаратная проверка.

Проверил. В user-mode нельзя скрафтить произвольный указатель. Зато можно получить указатель на все статические данные текущей программы (которая приложение, про библиотеки не знаю). Если в статических данных хранятся какие-то ключи, то к ним можно получить доступ. Но традиционные способы получить RCE закрыты. Поэтому я не вижу способов это эксплуатировать.

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

Зато можно получить указатель на все статические данные текущей программы (которая приложение, про библиотеки не знаю).

Так статические данные и так всем доступны. А уже на стеке просто так указатель не получить.

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.