ziglang | Unsorted

Telegram-канал ziglang - Язык Zig (канал)

156

Чат @ziglang_ru

Subscribe to a channel

Язык Zig (канал)

а да, и ещё addrspace(.generic) придётся переделать или удалить, но вроде как AVR и SPIR-V мейнтейнеры и так хотят убрать его

Читать полностью…

Язык Zig (канал)

Другой вариант: в Си есть паттерн с containerof, где из указателя к полю структуры получают указатель ко всей структуре.

В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре. Так как указатели невозможно "расширить" обратно, такой прикол не сработает. Для этих случаев есть аттрибуты, которые контролируют это ограничение (no subobject bounds)

Читать полностью…

Язык Zig (канал)

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

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

Будет обидно, если Rust и C/C++ будут работать спокойно дополнять друг друга изолированно и безопасно, а Zig станется самым небезопасным/непортируемым.

Читать полностью…

Язык Zig (канал)

нашел наконец, они тут повысили планку с миллионов строк кода на Си/C++ в мире до триллионов, но суть та же: железо намного легче заменить, чем язык. Достаточно в новые процессоры Intel и AMD добавить начиная с 2030 к примеру, и через 20 лет большинство компьютеров сами пользователи себе обновят (чтобы поиграть в игры 2050 года и т.д.), по самым типичным причинам, без огромных вложений

Читать полностью…

Язык Zig (канал)

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%

Читать полностью…

Язык Zig (канал)

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.

Читать полностью…

Язык Zig (канал)

К тому же, так как эти capability работают на уровне системы, они защищают всю память: не только ОЗУ, но и к примеру порты или регистры или стек.

Читать полностью…

Язык Zig (канал)

В CHERI:
* Её невозможно обойти.

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

* Она проверяется на уровне железа, с очень маленькой нагрузкой на производительность

* Она работает везде, для всех языков и с большой точностью, будь то Си, Zig, unsafe Rust, Python, и т.д.

Читать полностью…

Язык Zig (канал)

Можно заметить, что он похож на супер-слайс/срез как в 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
}
}

Читать полностью…

Язык Zig (канал)

Во общем, что это такое. Для начала, CHERI расшифровывается как Capability Hardware Enhanced RISC Instructions, поэтому чтобы понять суть, нужно начать с Capability:

Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно получить доступ и какие действия с ними разрешены.

CHERI использует эти capability, чтобы контролировать доступ к памяти на компьютере. Они реализованы в железе (поэтому hardware enchanced), в виде расширения для архитектур процессоров (ARM, RISC-V, x86 и т.д.), которое заменяет обычные указатели такими capability (поэтому RISC instructions)

Читать полностью…

Язык Zig (канал)

[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project

Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить:

CHERI заменяет указатели на capability-объекты, которые не являются целыми числами и не могут быть подделаны. Это нарушает исторически сложившиеся предположения в Clang и LLVM о том, что указатели могут быть без потерь преобразованы в целые числа и обратно. Это также касается обхода системы типов через память.

Читать полностью…

Язык Zig (канал)

через 15 минут будут рассказывать ещё про async https://www.twitch.tv/kristoff_it

Читать полностью…

Язык Zig (канал)

вернул старую, чет не зашло никому

Читать полностью…

Язык Zig (канал)

Zig's New Async I/O

#upstream #блоги

Читать полностью…

Язык Zig (канал)

remove async and await keywords; remove usingnamespace

Из хорошего: удалили async и await, так что теперь функции из нового плана можно писать без @"..."

Из плохого: убили usingnamespace окончательно...

#upstream

Читать полностью…

Язык Zig (канал)

В Zig для этого есть одна встроенная функция @fieldParentPtr. Компилятор Zig может просто проверять, используется ли она в каком-то месте для какой-то структуры. Если нет, включаем сжатие границ для них, если есть, отключаем.

Читать полностью…

Язык Zig (канал)

Пока есть время исправить ошибку с единственным типом 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;

Читать полностью…

Язык Zig (канал)

Реализация на уровне архитектуры:
https://www.youtube.com/watch?v=5F1_3eeEsU4

Порт Linux:
https://www.youtube.com/watch?v=aLc92JHfokY

Порт V8:
https://www.youtube.com/watch?v=3XBSny5Yc58

Читать полностью…

Язык Zig (канал)

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

Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный nullptr_t или NULL вместо кастомных. Т.е. опять же фиксы, полезные для всех архитектур

Читать полностью…

Язык 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 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 (канал)

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 (канал)

К примеру точности, в Zig можно сделать слайс и указать, к примеруадрес 100 и длину 10, т.е. можно использовать память с 100 по 110 байт.

В CHERI можно сделать указатель с таким же длмной, плюс добавить, к примеру, права только на чтение. Любое изменение черезу казатель блокируется процессором

Читать полностью…

Язык Zig (канал)

Теперь что делают эти capability: они проверяют на уровне процессора все доступы, сделанные через них, и разрешает только явно прописанные действия.

К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds:

const a: []const u8 = ...;
const b = a[1000]; // panic если вышел за диапазон

Я думаю, многим из вас эта проверка помогла найти какой-то баг в коде и т. д. Однако, у нашего варианта есть минусы:
* Она работает только в ReleaseSafe, Debug и функциях с setRuntimeSafety(true)
* Она проверяется программно, с дополнительной нагрузкой на производительность
* Её очень легко обойти

Читать полностью…

Язык Zig (канал)

В обычных указателях на обычных процессорах указатель содержит в себе только адрес.

В CHERI, capabilities содержат в себе не только адрес, но и права, границы и специальная метка, которая проверяет целостность. Это всё занимает память, поэтому на 64-битных архитектурах указатель занимает не 64 бит, а 128 бит (здесь лоомается usize)

Читать полностью…

Язык Zig (канал)

Если простыми словами, @intFromPtr и @ptrFromInt на этих архитектурах не будет работать, и usize с isize надо переделывать на них

Читать полностью…

Язык Zig (канал)

Resizable structs in Zig

VLA на зигушках

#блоги #библиотеки

Читать полностью…

Язык Zig (канал)

Ищу коллегу, пишущего на зиге для реализации одного из проектов. Подробности расскажу в созвоне, как и условия работы

Читать полностью…

Язык Zig (канал)

спасибо китайцам за новую аву

Читать полностью…

Язык Zig (канал)

https://youtu.be/pTADYXj_C7s?si=O4U6vnmZ3xnS4Wxk

Читать полностью…

Язык Zig (канал)

Matklad у праймаджена!

https://m.youtube.com/watch?v=V8Bg55lTUCw

Читать полностью…
Subscribe to a channel