- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
/* https://fstarlang.github.io/lowstar/html/Introduction.html#the-essence-of-low
Consider the following very simple program:
module Intro
module P = LowStar.Printf
module C = LowStar.Comment
module B = LowStar.Buffer
open FStar.HyperStack.ST
open LowStar.BufferOps
let main (): St Int32.t =
push_frame ();
let b: B.buffer UInt32.t = B.alloca 0ul 8ul in
b.(0ul) <- 255ul;
C.comment "Calls to printf are desugared via meta-programming";
let s = "from Low*!" in
P.(printf "Hello from %s\nbuffer contents: %xul\n"
s 8ul b done);
pop_frame ();
0l
....
Once compiled by the KreMLin compiler, we obtain the following C code:
*/
int32_t main()
{
uint32_t b[8U] = { 0U };
b[0U] = (uint32_t)255U;
/* Calls to printf are desugared via meta-programming */
Prims_string s = "from Low*!";
LowStar_Printf_print_string("Hello from ");
LowStar_Printf_print_string(s);
LowStar_Printf_print_string("\nbuffer contents: ");
LowStar_Printf_print_lmbuffer_u32((uint32_t)8U, (uint32_t *)b);
LowStar_Printf_print_string("\n");
return (int32_t)0;
}
Какая-то компилируемая в сишку хренотень с завтипами, разрабатываемая в Microsoft Research
Да, это не труъ AOT. Но приложухи после него вполне шустро работают.
Ну вот... т.е. это скорее стартовый снепшот для JIT'а, чем нативный образ.
Кстати, а как реализована библиотека «Phobos» для языка «D»? Ну там всякие «std.functional», где код передаётся строками? Она в рантайме вызывает модуль для компиляции кода и инжектит сгенерированный код?
https://dlang.org/phobos/std_functional.html
Дизасм:
И ещё куча питушни для реализации writeln. Фактически writeln — это крестошаблон.
Да он и сейчас вполне норма... JIT'ы ведь работают.
точнее создать можно, загрузить нельзя
В base system таких файлов нет
В винде такое только в ядре решились сделать.
да, так тоже можно)
Ну тут достаточно запретить грузить файлы, которые не помечены как исполняемые. А дальше можно на уровне файлухи вырубить "x", а на файлухе с исполняемыми файлами отобрать у юзера "w" и хрен ты насрёшь байтиков в исполняемый файл.
Надо еще убедиться в том, что нет таких готовых исполняемых файлов, которые можно было бы перезаписать.
> дальше можно на уровне файлухи вырубить "x", а на файлухе с исполняемыми файлами отобрать у юзера "w"
Их может допустим перезаписать какой-нибудь кривой говноскрипт, у которого будут такие права
Ну тут можно пойти дальше и через selinux запретить привилегированным процессам шариться по юзерским каталогам. Вообще. Всем. Ну кроме какой-нибудь бекапилки (но у неё можно отобрать write на систему) и тулов для управления юзерами (им достаточно delete и create, без чтения и записи обойдутся).
В интеловских процах сейчас тоже такая фишка есть, кстати (SMAP и SMEP).
>SMEP
>Не позволяет процессору, будучи в ring0, выполнять код со страниц, помеченных флагом User.
>Таким образом, столь привычные способы эксплуатации, когда есть возможность перезаписать указатель в какой-нибудь структуре в ядре адресом в юзер-моде, заммапить этот адрес и ждать, что ядро прыгнет на него исполнять наш шелл-код, перестают работать.
>SMAP
>Не позволяет процессору, будучи в ring0, обращаться (например, читать) к страницам, помеченным флагом User.
>Поскольку ядру это необходимо в работе, были введены 2 новые инструкции, которые должны использоваться перед и после обращением к страницам памяти с флагом User: CLAC/STAC.
>Использование SMAP незначительно увеличивает размер ядра и уменьшает скорость работы.
Это вообще не об этом. Запретить что-то читать и писать на жесткий диск этим не выйдет
Тут надо делать поеботину примерно как в KasperskyOS https://youtu.be/zUyllpPYpXY?t=746
Ну я про аналогию, что супер-юзер не может лезть к данным обычного юзера и исполнять его код. Суть уязвимостей ведь абсолютно такая же -- кривой привелигированный код без причины взял что-то у юзера и неаккуратно поюзал.
> как создать безопасный промышленный шлюз
На авито за 1000 рублей купить
На помойке найти
Чтобы mmapнуть регион с W&X нужно иметь ключ в заголовке ELF
Но с обычной FS такой бинарь не загрузится: нужно прикрутить FS со спец ключом
Base system и home без такого ключа, так что там физически не может быть W&X
А usr/local с таким ключом, так что в сёрд парти софте можно срать, но на продакшен сервере такого софта лучше не иметь
Потому для SMTP, WWW, Perl, FTP и X11 у них свои сборки без W&X
Net: максимальная переносимость, RUMP kernel.
Free: максимально производительный сервер на x86, драйверов очень много, большое коммунити, хороший handbook.
DragonFly: максимальная многопоточность (раньше всех убрали локи в ядре чтобы использовать все ядра), своя файловая система похожая на ZFS
На сервере приложений логично иметь free, на роутере или бастионе Open. Остальное скорее академический интерес
А хотя какая разница, в любом случае дотнет говно, как впрочем и жаба.
Ну CLR (он же MSIL) там модифицировать можно
https://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time
И вот еще https://stackoverflow.com/questions/7299097/dynamically-replace-the-contents-of-a-c-sharp-method
> Новые то я и в крестах могу высрать при желании.
Ты и в крестах можешь mprotect-нуть сегмент с исполняемым кодом и переписать байтики опкодов в какой-то там функции и потом эту патченную хуйню исполнять.
Хуй там... Откуда я знаю, куда ещё конпелятор заинлайнил и заанроллил код, который я хочу запатчить?
А новый класс будет через VMT взаимодействовать, там всё чисто.
Для этого просто нужен особый компилятор, который будет предсказуемым образом что-то инлайнить и анроллить по какой-то строгой спецификации.
Ну такое...
В одном варианте какие-то кишки рантайма/джита пинают чтобы переджитить заново, в другом варианте нативный jmp (sic!) патчат в джит-переходнике.
Может быть я невнимательно читала, но выглядит как ёбаные хаки.
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.assemblybuilder?v iew=net-5.0
Загрузка/генерация новых классов не ломает AOT. Старый скомпилированный код либо их вообще не увидит либо будет к ним обращаться через какие-то уже известные ему интерфейсы.
А новый класс потрогает. Да и старый может потрогать через рефлексию, и в этом случае оно разAOTится обратно кмк
Чтобы рефлексия работала я вижу джва варианта:
- Хранить в метаинфе для рефлексии ссылку на нативный метод. Тогда линкер его не удалит даже если все точки вызова заинлайнились и нам всегда будет что вызвать.
- Хранить в метаинфе оригинальный IL метода. Тогда его всегда можно воссоздать на лету и проинтерпретировать/заджитить.
Struct types
Flat records are part of the original paper formalization, and are translated as regular C structs.
In the original paper, structs may be allocated within buffers.
Still in the original paper, one may access a buffer index, then select a number of fields.
https://github.com/FStarLang/kremlin/blob/6e60e33aac1551c1ae20e4e02cb66a188935990b/include/kremlin/internal/target.h#L38
Проверка на NULL после malloc()? Не, не слышали
Только зачем тогда что-то выделять в бесконечном адресном пространстве, если всю хуйню можно в бигинте хранить?
https://ru.wikipedia.org/wiki/Путивльский_кремль
Какой понятный синтаксис )))