Язык Zig (канал)
174 subscribers
26 photos
3 videos
6 files
239 links
Download Telegram
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
Язык 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

Они примерно подсчитали:

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
Тут главный прикол в том, что для программ и библиотек на C/C++ в большинстве случаев им было достаточно использовать типы из C99 и позднее, к примеру корректно использовать intrptr_t, size_t и т.д., и в таком случае можно даже не прятать за ifdef, потому что эти фиксы подходят для всех платформ.

Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный 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 года и т.д.), по самым типичным причинам, без огромных вложений
Прямо сейчас, по меркам безопасности в релизных сборках можно расставить языки Rust -> Zig -> C/C++. В случае Rust к примеру, FFI небезопасен, и какая-нибудь программа может вызвать функцию из библиотеки на C или Zig, которая ломает всю безопасность системы спокойно. Ну или в unsafe делают transmute рандомный какой нибудь.

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

Будет обидно, если Rust и C/C++ будут работать спокойно дополнять друг друга изолированно и безопасно, а Zig станется самым небезопасным/непортируемым.
1💔1
Пока есть время исправить ошибку с единственным типом usize и внедрить улучшения в сам язык перед 1.0, думаю стоит воспользоваться.

К примеру на Си у них есть хедер с такими функциями:
cheri_address_get, cheri_base_get, cheri_address_set и т.д.

На Zig это можно было бы представить так же, как поля для срезов ptr и len, только для указателей:

var ptr: [*]u32 = ...;
ptr.address += 1;
ptr.permissions = .read_only;
3
Другой вариант: в Си есть паттерн с containerof, где из указателя к полю структуры получают указатель ко всей структуре.

В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре. Так как указатели невозможно "расширить" обратно, такой прикол не сработает. Для этих случаев есть аттрибуты, которые контролируют это ограничение (no subobject bounds)
1
Язык Zig (канал)
Другой вариант: в Си есть паттерн с containerof, где из указателя к полю структуры получают указатель ко всей структуре. В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре.…
В Zig для этого есть одна встроенная функция @fieldParentPtr. Компилятор Zig может просто проверять, используется ли она в каком-то месте для какой-то структуры. Если нет, включаем сжатие границ для них, если есть, отключаем.
Язык Zig (канал)
Если простыми словами, @intFromPtr и @ptrFromInt на этих архитектурах не будет работать, и usize с isize надо переделывать на них
а да, и ещё addrspace(.generic) придётся переделать или удалить, но вроде как AVR и SPIR-V мейнтейнеры и так хотят убрать его
потому что в гибрид моде у обычных указателей будет addrspace 0 (как обычно на x86-64), а у capabilities 200, чтобы старый код мог работать дальше на CHERI системах (например, закрытые программы или библиотеки, которые нельзя пересобрать), и рантайм мог отличать его от нового
в обоих случаях проверки будут работать, потому что старый код с указателями в рантайме просто прячет за собой capability, и те же проверки на границы и т.д., просто их не модифицируют вручную (не сжимают границы функциями по типу cheri_bounds_set т.д., потому что их нет в старом коде)
[RFC] Libc++ taking a dependency on Boost.Math for the C++17 Math Special Functions

У libc++ (стандартной библиотеки C++ от LLVM) может появиться новая зависимость Boost.Math, которая позволит докончить поддержку C++17 в коде.

Почти все соглашаются и поддержиают это решению, но Эндрю говорит это помешает сильно для zig и zig c++:

This is apocalyptic for us. We, and our users would strongly prefer missing C++17 features than a Boost.Math dependency.

If LLVM moves forward with this, we will very likely patch it out.

Правда, весомых технических причин он не указал, так что люди не поняли...
https://codeberg.org/breadtom/expozig

Альтернативный компилятор для Zig на Си. Автор хочет другой способ бутстрапинга сделать, без WASM файлов, от Си сразу к Zig
👍4
https://github.com/ziglang/zig/pull/24699

Эндр подчищает ring buffers в стандартной библиотеке (их в сумме 4, один он убирает в другом ПР и один тут).

BoundedArray он так и не полюбил :( опять хочет его удалить.

#upstream
😢4
Старый Hello World 2015 года:

export executable "hello";

#link("c")
extern {
fn printf(__format: *const u8, ...) -> i32;
fn exit(__status: i32) -> unreachable;
}

export fn _start() -> unreachable {
printf("Hello, world!\n");
exit(0);
}

Влияние Rust здесь хорошо видно.
😁2