RSS Telegram YouTube Apple Яндекс Spotify Amazon Почта

93. os.Root, ReactJS to Go, tsgo

16.03.2025

Скачать

К списку выпусков

Ссылки выпуска:

We Replaced Our React Frontend with Go and WebAssembly

Dagger - это инструмент для автоматизированной сборки для сложных проектов. С его помощью можно в Go коде описать процесс сборки, а так как это Go-код, то допустимо использовать всё что угодно: условия, циклы, HTTP-вызовы, подключения к СУБД и т.д. Это как если бы вы писали скрипты, но здесь всё на Go. Плюс к этому Dagger более производительно кеширует Docker-сборки, а именно глобально для всех собираемых проектов. Вобщем, если обычного Dockerfile не хватает, то можете глянуть в сторону Dagger.

Код Dagger открыт, плюс, команда предоставляет SaaS, у которого есть как TUI, так и WebUI.

Разработчики Dagger поддерживали две сходные по функционалу кодовые базы: TUI (Terminal User Interface) на Go и WebUI на React. Новую версию фронтенда переписанли на Go с использованием Go-app. Теперь оба проекта на Go, что упростило их поддержку.

Как работает go-app? Вы пишете код на Go, который умеет работать с DOM-деревом, делать HTTP- запросы из браузера и т.д. А т.к. это код на Go, то можно использовать то же самое SDK для работы с нужными вам API. Т.е. поддерживаете одну кодовую базу как для TUI, так и для WebUI (т.е. вашего WASM-приложения).

Файловая песочница в Go 1.24

В официальном блоге ЯП Go вышла публикация про новое API os.Root в SDK Go1.24+.

Существует класс уязвимостей, позволяющая атакующему выйти получить доступ к файлам за пределами разрешенных директорий. Атака осуществляется за счет манипулирования входными путями, например, ../../../etc/passwd или манипулированием символическими ссылками, если у атакующего есть доступ к файловой системе. Атакующий может в бесконечном цикле подменять файл на символическую ссылку на какой-то другой файл и потом возвращать обратно файл, чтобы это был обычный файл, например. Такой тип атаки называется symlink race attack.

Как защищаться? Первый способ - проверять пользовательский ввод, но это не защитит от TOCTOU атак. Второй способ лучше - в Linux есть системные вызовы, которые ограничивают дерево файловой системы указанной родительской директорией: openat и openat2. В качестве первого аргумента нужно передать дескриптор открытой директории.

Этот механизм использует новое API os.OpenRoot:

root, err := os.OpenRoot("/some/root/directory")
if err != nil {
    return err
}
defer root.Close()

У открытого Root доступно следующее API:

func (*Root) Create(string) (*File, error)
func (*Root) Lstat(string) (fs.FileInfo, error)
func (*Root) Mkdir(string, fs.FileMode) error
func (*Root) Open(string) (*File, error)
func (*Root) OpenFile(string, int, fs.FileMode) (*File, error)
func (*Root) OpenRoot(string) (*Root, error)
func (*Root) Remove(string) error
func (*Root) Stat(string) (fs.FileInfo, error)

Однако, защиту выше можно обойти, если у атакующего есть доступ к файловой системе и он может смонтировать раздел в режиме --bind (меппинг директории по другому пути в файловой системе).

Когда использовать os.Root? Когда в коде используется filepath.Join.

Компилятор TypeScript на Go

Несколько дней назад главный архитектор TypeScript в MicroSoft анонсировал новый компилятор TypeScript tsgo, который билдит проекты примерно в 10 раз быстрее.

Текущий компилятор (а точнее транспилятор - преобразователь, слово trans) написан на TypeScript, а значит работает в single-thread режиме. Построение AST-деревьев можно легко делать конкурентно, а значит потенциально быстрее. Новый компилятор на Go почти готов и ожидается полные переход на него в ближашие месяцы.

Также, стоит отметить, что появление таких проектов позитивно сказывается и на сам ЯП Go: уже нашли способ оптимизировать escape-анализ, чтобы в 5 раз ускорить сборку tsgo, а значит и других проектов.