Бесплатно Экспресс-аудит сайта:

28.01.2021

Google исправила RCE-уязвимость в языке Golang

Специалисты компании Google устранили опасную уязвимость ( CVE-2021-3115 ) удаленного выполнения кода в языке Go (Golang), затрагивающую пользователей Windows, которые выполняют команду go get.

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

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

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

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

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

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

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

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

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