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 вышла публикация про новое 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 в MicroSoft анонсировал новый компилятор TypeScript
tsgo
, который билдит проекты примерно в 10 раз быстрее.
Текущий компилятор (а точнее транспилятор - преобразователь, слово trans) написан на TypeScript, а значит работает в single-thread режиме. Построение AST-деревьев можно легко делать конкурентно, а значит потенциально быстрее. Новый компилятор на Go почти готов и ожидается полные переход на него в ближашие месяцы.
Также, стоит отметить, что появление таких проектов позитивно сказывается и на сам ЯП Go: уже нашли способ
оптимизировать escape-анализ, чтобы в 5 раз ускорить сборку tsgo
, а значит и других проектов.