Вот пишете вы программу на Go, которая добавляет файлы в zip-архив. Используете https://pkg.go.dev/archive/zip, который под капотом использует https://pkg.go.dev/compress/flate. Документация на первый ничего не говорит про используемый уровень компрессии второго.
Две викторины:
Две викторины:
How to Go wrong
Вот пишете вы программу на Go, которая добавляет файлы в zip-архив. Используете https://pkg.go.dev/archive/zip, который под капотом использует https://pkg.go.dev/compress/flate. Документация на первый ничего не говорит про используемый уровень компрессии второго.…
Какой уровень компрессии DEFLATE используют методы типа https://pkg.go.dev/archive/zip#Writer.AddFS, если `RegisterCompressor` не используется?
Anonymous Quiz
30%
-1 (flate.DefaultCompression)
24%
0 (flate.NoCompression)
14%
1 (flate.BestSpeed)
8%
4 (просто так)
10%
5 (просто так)
7%
6 (просто так)
6%
9 (flate.BestCompression)
🤔13👎6
How to Go wrong
Вот пишете вы программу на Go, которая добавляет файлы в zip-архив. Используете https://pkg.go.dev/archive/zip, который под капотом использует https://pkg.go.dev/compress/flate. Документация на первый ничего не говорит про используемый уровень компрессии второго.…
Какой уровень компрессии DEFLATE используют методы типа https://pkg.go.dev/compress/flate#NewWriter, если в него передаётся -1 (DefaultCompression)?
Anonymous Quiz
29%
0 (NoCompression)
18%
1 (BestSpeed)
7%
4 (просто так)
25%
5 (просто так)
6%
6 (просто так)
14%
9 (BestCompression)
🤣31👎8
Forwarded from Go Update
🔐runtime/secret: secret.Do 🔐
Тем временем, абсолютно буднично и рутинно произошло хорошее: пакет
Собственно весь пакет пока состоит из одну функции:
• Весь стек который использовался во время работы горутины заполняется нулями. Если при работе стек «рос» (по факту — копировался в новое место) то прямо во время копии старый участок памяти рантайм заполнит нулями.
• Все регистры ЦПУ которые «могут содержать секреты» будут заполнены нулями после выхода. Подозреваю, что здесь речь идет о регистрах которые не используются самим рантаймом для служебных действий (верх, низ стека и прочая).
• Если в процессе работы переданной функции мы создаем объекты в хипе, то сразу после сборки мусора, их память будет заполнена нулями.
• Если внутри передаваемой функции произошла паника, подменяют стектрейс, что-бы скрыть любую информацию о переданной функции.
Для большинства это изменение ничего не меняет.
Но для тех кто работает с криптографией (включая TLS которое мы все используем в HTTPS, HTTP/2 и gRPC без флага insecure) это хорошая новость, которая позволяет усилить защиту приложений и усложнить чтение секретов злонамеренными акторами, даже если скомпрометирована вся железка. Плюс «надежную» очистку секретов часто требуют при сертификации софта в разных регионах нашей планеты.
П.С. Пакет пока доступен только для архитектур
П.П.С. Так-же пока пакет работает только под Linux.
Тем временем, абсолютно буднично и рутинно произошло хорошее: пакет
runtime/secret получил свою реализацию и будет доступен в Go 1.26 (правда будет скрыт за флагом GOEXPERIMENT=runtimesecret устанавливаемым во время компиляции).Собственно весь пакет пока состоит из одну функции:
secret.Do, которая принимает на вход функцию с сигнатурой func() и подчищает за ней следующие вещи на выходе из этой функции:• Весь стек который использовался во время работы горутины заполняется нулями. Если при работе стек «рос» (по факту — копировался в новое место) то прямо во время копии старый участок памяти рантайм заполнит нулями.
• Все регистры ЦПУ которые «могут содержать секреты» будут заполнены нулями после выхода. Подозреваю, что здесь речь идет о регистрах которые не используются самим рантаймом для служебных действий (верх, низ стека и прочая).
• Если в процессе работы переданной функции мы создаем объекты в хипе, то сразу после сборки мусора, их память будет заполнена нулями.
• Если внутри передаваемой функции произошла паника, подменяют стектрейс, что-бы скрыть любую информацию о переданной функции.
Для большинства это изменение ничего не меняет.
Но для тех кто работает с криптографией (включая TLS которое мы все используем в HTTPS, HTTP/2 и gRPC без флага insecure) это хорошая новость, которая позволяет усилить защиту приложений и усложнить чтение секретов злонамеренными акторами, даже если скомпрометирована вся железка. Плюс «надежную» очистку секретов часто требуют при сертификации софта в разных регионах нашей планеты.
П.С. Пакет пока доступен только для архитектур
amd64 и arm64 (если вы не поняли, что это значит, это хорошо тк вы точно попадаете в доступные архитектуры).П.П.С. Так-же пока пакет работает только под Linux.
GitHub
runtime/secret: implement new secret package · golang/go@a3fb92a
Implement secret.Do.
- When secret.Do returns:
- Clear stack that is used by the argument function.
- Clear all the registers that might contain secrets.
- On stack growth in secret mode, clea...
- When secret.Do returns:
- Clear stack that is used by the argument function.
- Clear all the registers that might contain secrets.
- On stack growth in secret mode, clea...
👍27👏7
Старожилы всхлипнули — Dave Cheney вернулся с новым квизом: https://dave.cheney.net/2025/11/27/pointer-pop-quiz
👍16🤔4