Атака на Dependabot: внедрение вредоносного кода через бота
Есть такой Dependabot - популярный бот на Github, который регулярно проверяет проекты на наличие устаревших зависимостей. Если он находит обновления, то создает pull request (PR), в котором предлагает внести изменения в код для обновления.
Есть разработчики - они обычно настраивают рабочий процесс так, чтобы автоматически объединять все PR от Dependabot. Проверка происходит через переменную github.actor. Если ее значение = dependabot[bot], то происходит слияние кода.
И есть злоумышленники. Они знают, что github.actor не всегда указывает на того, кто изначально создал PR, и существует возможность для атаки confused deputy. Для этого злодей выполняет следующие действия:
- создает форк целевого репозитория, у которого разработчики выставили настройки автоматического приема PR от Dependabot;
- добавляет свой вредоносный код в основную ветку своего форка;
- активирует Dependabot в своем форке и добавляет какую-нибудь устаревшую зависимость, чтобы привлечь внимание бота. Dependabot создает свою ветку обновлений в форке, и поскольку она основана на основной ветке форка, то содержит вредоносный код злодея.
- создает PR в целевом репозитории жертвы, используя ветку бота
- и ничего не получается, ведь в созданном PR значение github.actor (инициатор) все еще принадлежит злодею, поэтому он возвращается к оригинальному PR от Dependabot и комментирует: @dependabot recreate
- Dependabot выполняет команду: пересоздает свою ветку и принудительно отправляет в нее изменения (force-push). Принудительная отправка изменений в ветку повторно запускает процесс слияния в целевом репозитории (репозитории-жертве).
И вот на этом этапе происходит магия: когда Dependabot сам пересоздает и принудительно отправляет изменения, он становится «исполнителем» этого последнего события. Значение github.actor меняется и условие для автослияния выполняется:
if: ${{ github.actor == ‘dependabot[bot]’ }}
PR с вредоносным кодом оказывается в целевом репозитории.
Нетривиальная атака. Поэтому попадает в коллекцию атак на разработчиков, о которой на следующей неделе расскажу на мероприятии IT IS Conf в Екатеринбурге.