В Google исправили серьезную уязвимость в Golang

Дата: 26.01.2021. Автор: Артем П. Категории: Новости по информационной безопасности

В январе 2021 года специалисты Google устранили серьезную уязвимость удаленного выполнения кода (RCE) в языке GO (Golang). Ошибка отслеживается как CVE-2021-3115, затрагивает пользователей Windows Go, которые выполняют go get команду при поиске PATH в Windows.

Уязвимость внедрения команд в проекте Golang была выявлена японским специалистом по кибербезопасности под псевдонимом RyotaK. Уязвимость связана с тем, как работает процесс компиляции, когда пользователь запускает команду go get для получения репозитория.

Обычно в системах Windows команда оболочки ОС, которая запускается пользователем или программой, заставляет сначала оболочку искать исполняемый/двоичный файл, который связан с этой командной, в текущем каталоге, после чего переходит на список каталогов, указанный в системной переменной PATH.

К примеру, если ввести в командную строку Windows netstat, то система сначала будет искать в текущем каталоге исполняемый файл netstat.exe, netstat.bat, либо другие исполняемые файлы netstat.*, которые получат приоритет и будут выполнены:

Если в текущей директории нет файлов netstat, то тогда оболочка Windows будет искать системную утилиту netstat, расположение которой указано в переменной Windows %PATH%.

Из-за рисков безопасности, которые связаны с таким поведением, и оболочка Unix, и Windows PowerShell ранее отказывались от него по умолчанию, отдавая приоритет расположениям переменных %PATH%, нежели ненадежным текущим каталогам при выполнении команд. Это означает, что запуск netstat в PowerShell запустит системную утилиту netstat, а не локально присутствующий исполняемый файл netstat.bat, потому что PoweShell отдает приоритет поиску двоичного файла по этому имени в каталогах %PATH%.

Однако для согласованности двоичные файлы Golang имитируют правила Unix в системах Unix, правила Windows в Windows. Это значит, что выполнение следующей команды Go приведет к несколько различному поведению в системах Unix и Windows.

out, err := exec.Command("go", "version").CombinedOutput()

Эта строка Golang эквивалентна запуску команды go version оболочки ОС.

В Windows локально присутствующий двоичный файл go получит приоритет, в то время как системы Unix сначала будут искать свою переменную $PATH, чтобы удостовериться, существует ли двоичный файл go в одном из надежных расположений.

Такая модель приоритета локального, ненадежного каталога над расположениями PATH также реализуется вспомогательными библиотеками и компиляторами, которые включены в Go, такими как cgo (утилита, используемая для генерации пакетов Go, которые вызывают код C). Когда cgo компилирует код C в Windows, исполняемый файл Golang сначала ищет компилятор GCC в (ненадежном) локальном каталоге.

Несмотря на то, что большинство этих вызовов происходит безопасно, компилятор GCC вызывается функцией Go exec.Command, которая в Windows позволяет Go запускать вредоносный  файл gcc.exe, добавленный хакерами в свои источники приложений, а не легальный компилятор GCC.

Подобную проблему можно было выявить и предотвратить за счет нескольких вызываемых промежуточных библиотек и компиляторов (к примеру, gcc или cgo), но представители проекта Golang взяли на себя ответственность за имеющуюся ошибку и выпустили исправление.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Поделиться ссылкой

Артем П

Об авторе Артем П

Автор на портале cisoclub.ru. Добавляйте ваш материал на сайт в разделе "Разместить публикацию".
Читать все записи автора Артем П

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *