Forwarded from 👨💻
Ищу коллегу, пишущего на зиге для реализации одного из проектов. Подробности расскажу в созвоне, как и условия работы
🤔10
Forwarded from Андрей Краевский
через 15 минут будут рассказывать ещё про async https://www.twitch.tv/kristoff_it
❤1
LLVM Discussion Forums
[RFC] Upstream target support for CHERI-enabled architectures
Authors: Owen Anderson, Jessica Clarke, Alex Richardson, David Chisnall This RFC is a proposal to gain consensus on upstreaming target support for the CHERI-enabled architectures to the LLVM project. This is an “entire project” RFC, as CHERI support touches…
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project
Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить:
Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить:
CHERI заменяет указатели на capability-объекты, которые не являются целыми числами и не могут быть подделаны. Это нарушает исторически сложившиеся предположения в Clang и LLVM о том, что указатели могут быть без потерь преобразованы в целые числа и обратно. Это также касается обхода системы типов через память.
🤯6👍1
Язык Zig (канал)
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить: CHERI заменяет указатели на capability-объекты, которые…
Если простыми словами,
@intFromPtr и @ptrFromInt на этих архитектурах не будет работать, и usize с isize надо переделывать на них🤯4
Язык Zig (канал)
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить: CHERI заменяет указатели на capability-объекты, которые…
Во общем, что это такое. Для начала, CHERI расшифровывается как Capability Hardware Enhanced RISC Instructions, поэтому чтобы понять суть, нужно начать с Capability:
Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно получить доступ и какие действия с ними разрешены.
CHERI использует эти capability, чтобы контролировать доступ к памяти на компьютере. Они реализованы в железе (поэтому hardware enchanced), в виде расширения для архитектур процессоров (ARM, RISC-V, x86 и т.д.), которое заменяет обычные указатели такими capability (поэтому RISC instructions)
Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно получить доступ и какие действия с ними разрешены.
CHERI использует эти capability, чтобы контролировать доступ к памяти на компьютере. Они реализованы в железе (поэтому hardware enchanced), в виде расширения для архитектур процессоров (ARM, RISC-V, x86 и т.д.), которое заменяет обычные указатели такими capability (поэтому RISC instructions)
❤2👍1
Язык Zig (канал)
Во общем, что это такое. Для начала, CHERI расшифровывается как Capability Hardware Enhanced RISC Instructions, поэтому чтобы понять суть, нужно начать с Capability: Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно…
В обычных указателях на обычных процессорах указатель содержит в себе только адрес.
В CHERI, capabilities содержат в себе не только адрес, но и права, границы и специальная метка, которая проверяет целостность. Это всё занимает память, поэтому на 64-битных архитектурах указатель занимает не 64 бит, а 128 бит (здесь лоомается usize)
В CHERI, capabilities содержат в себе не только адрес, но и права, границы и специальная метка, которая проверяет целостность. Это всё занимает память, поэтому на 64-битных архитектурах указатель занимает не 64 бит, а 128 бит (здесь лоомается usize)
🤯3❤1
Можно заметить, что он похож на супер-слайс/срез как в Zig, который тоже содержит в себе границы (длину в случае Zig). В коде это можно представить так:
const Slice = struct(u128) {
address: u64,
len: u64,
}
const Capability = struct(u128) {
address: u64,
metadata: struct(u64) {
permissions: ... // bitfield,
type: ... // enum или boolean
bounds: ... // специальной свой мини-float
}
}👍3
Теперь что делают эти capability: они проверяют на уровне процессора все доступы, сделанные через них, и разрешает только явно прописанные действия.
К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds:
Я думаю, многим из вас эта проверка помогла найти какой-то баг в коде и т. д. Однако, у нашего варианта есть минусы:
* Она работает только в ReleaseSafe, Debug и функциях с setRuntimeSafety(true)
* Она проверяется программно, с дополнительной нагрузкой на производительность
* Её очень легко обойти
К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds:
const a: []const u8 = ...;
const b = a[1000]; // panic если вышел за диапазон
Я думаю, многим из вас эта проверка помогла найти какой-то баг в коде и т. д. Однако, у нашего варианта есть минусы:
* Она работает только в ReleaseSafe, Debug и функциях с setRuntimeSafety(true)
* Она проверяется программно, с дополнительной нагрузкой на производительность
* Её очень легко обойти
Язык Zig (канал)
Теперь что делают эти capability: они проверяют на уровне процессора все доступы, сделанные через них, и разрешает только явно прописанные действия. К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds: const…
В CHERI:
* Её невозможно обойти.
Я не показал в struct, но на картине видно, что дополнительно к каждому указателю хранится тег в отдельной памяти, который проверяет целостность. Если указатель изменили неправильно или "подделали" (к примеру рандомное число превратили в адрес), он заблокирует любой доступ по этому указателю и вернет аппаратную ошибку.
* Она проверяется на уровне железа, с очень маленькой нагрузкой на производительность
* Она работает везде, для всех языков и с большой точностью, будь то Си, Zig, unsafe Rust, Python, и т.д.
* Её невозможно обойти.
Я не показал в struct, но на картине видно, что дополнительно к каждому указателю хранится тег в отдельной памяти, который проверяет целостность. Если указатель изменили неправильно или "подделали" (к примеру рандомное число превратили в адрес), он заблокирует любой доступ по этому указателю и вернет аппаратную ошибку.
* Она проверяется на уровне железа, с очень маленькой нагрузкой на производительность
* Она работает везде, для всех языков и с большой точностью, будь то Си, Zig, unsafe Rust, Python, и т.д.
🤓3🤯2👍1
Язык Zig (канал)
В CHERI: * Её невозможно обойти. Я не показал в struct, но на картине видно, что дополнительно к каждому указателю хранится тег в отдельной памяти, который проверяет целостность. Если указатель изменили неправильно или "подделали" (к примеру рандомное число…
К примеру точности, в Zig можно сделать слайс и указать, к примеруадрес 100 и длину 10, т.е. можно использовать память с 100 по 110 байт.
В CHERI можно сделать указатель с таким же длмной, плюс добавить, к примеру, права только на чтение. Любое изменение черезу казатель блокируется процессором
В CHERI можно сделать указатель с таким же длмной, плюс добавить, к примеру, права только на чтение. Любое изменение черезу казатель блокируется процессором
Язык Zig (канал)
К примеру точности, в Zig можно сделать слайс и указать, к примеруадрес 100 и длину 10, т.е. можно использовать память с 100 по 110 байт. В CHERI можно сделать указатель с таким же длмной, плюс добавить, к примеру, права только на чтение. Любое изменение…
К тому же, так как эти capability работают на уровне системы, они защищают всю память: не только ОЗУ, но и к примеру порты или регистры или стек.
🤩2👍1
https://tratt.net/laurie/blog/2023/two_stories_for_what_is_cheri.html
Из всех ОС у них сейчас самый полноценный вариант на FreeBSD, где они в своей коллекцию портов пометили 25к из примерно 40к пакетов как работающих на CHERI, из них 10к работающих на чистых capability и 15к в гибридном режиме
https://ctsrd-cheri.github.io/cheribsd-getting-started/packages/index.html
Из всех ОС у них сейчас самый полноценный вариант на FreeBSD, где они в своей коллекцию портов пометили 25к из примерно 40к пакетов как работающих на CHERI, из них 10к работающих на чистых capability и 15к в гибридном режиме
https://ctsrd-cheri.github.io/cheribsd-getting-started/packages/index.html
Язык Zig (канал)
https://tratt.net/laurie/blog/2023/two_stories_for_what_is_cheri.html Из всех ОС у них сейчас самый полноценный вариант на FreeBSD, где они в своей коллекцию портов пометили 25к из примерно 40к пакетов как работающих на CHERI, из них 10к работающих на чистых…
We have been demonstrating the second by porting large software stacks to Morello. This includes the entire FreeBSD userland and kernel (Linux is not quite finished), the userspace graphics stack, Weston (including 3D acceleration), the Qt and KDE core libraries, and a bunch of applications (Chromium is nearly finished). This is now at the point where people are starting to believe our claims about compatibility.
Тут репорт из 2021 про размер изменения для портирования на CHERI:
https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf
Они примерно подсчитали:
https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf
Они примерно подсчитали:
Our results are extremely exciting: It appears that key elements of the stack
were adapted for memory-safe execution with little difficulty (0.026% LoC changed), and that
CHERI memory safety and CHERI software compartmentalization had a strong potential
mitigation impact (ranging from 40% of past vulnerabilities for KDE up to 100% in key
supporting libraries). We described a number of limitations to our study, and key directions
for ongoing research and development
Язык Zig (канал)
Тут репорт из 2021 про размер изменения для портирования на CHERI: https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf Они примерно подсчитали: Our results are extremely exciting: It appears that…
In total we compiled more than 6 million source lines of code for CHERI C/C++ successfully with only a very few changes: 2071 LoC or 0.034%
Тут главный прикол в том, что для программ и библиотек на C/C++ в большинстве случаев им было достаточно использовать типы из C99 и позднее, к примеру корректно использовать intrptr_t, size_t и т.д., и в таком случае можно даже не прятать за ifdef, потому что эти фиксы подходят для всех платформ.
Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный nullptr_t или NULL вместо кастомных. Т.е. опять же фиксы, полезные для всех архитектур
Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный nullptr_t или NULL вместо кастомных. Т.е. опять же фиксы, полезные для всех архитектур
👍2🤔1
Язык Zig (канал)
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить: CHERI заменяет указатели на capability-объекты, которые…
CHERI-basics.pdf
3.1 MB
нашел наконец, они тут повысили планку с миллионов строк кода на Си/C++ в мире до триллионов, но суть та же: железо намного легче заменить, чем язык. Достаточно в новые процессоры Intel и AMD добавить начиная с 2030 к примеру, и через 20 лет большинство компьютеров сами пользователи себе обновят (чтобы поиграть в игры 2050 года и т.д.), по самым типичным причинам, без огромных вложений