Исследователи из компании JFrog обнаружили в составе Docker-образа "cabotage-app" токен, предоставляющий доступ с правами администратора к репозиториям Python, PyPI и Python Software Foundation на GitHub. Токен был найден в бинарном файле "__pycache__/build.cpython-311.pyc" с прокэшированным скомпилированным байткодом...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=61531
Расскажите ему про .gitignore.
И про то что в гите можно смотреть что ты коммитаешь, а не коммитать весь треш
чушь несете! какой gitignore! речь про docker-образ.мамкины программисты!
тока в Git токен не попал :-)а вот в бинарник попал — что нам напоминает правило:
не нужно ВООБЩЕ в открытый доступ выкладывать то что скомпилировано на твоём лаптопе — выкладывай в паблик только то что скомпилировала общий сборочный конвеер на сервере
Воот, теперь-то все как надо, теперь оно и в гит попадет. Потом конечно будет удалено, новым комитом.
> И про то что в гите можно смотреть что ты коммитаешь, а не коммитать весь трешВ этой новости прекрасно все. Начиная от комита в гит левого мусора, которого там быть вообще не должно, через доступ к инфраструктуре от души, а вишенкой на торте - КТО это все организовал. Это оглущительный успех питон-фаундации, кадровой политики и пиара, супер-комбо все в 1.
Так токен же вроде в docker-образе нашли а не в гите, нет?
> вишенкой на торте - КТО это все организовалви таки имеете что-то против гомо-нигг после прочтения КоК'а !?
Ты правда думаешь что питон-девелопер способен это понять?
.dockerignore
Скорее про .dockerignore
на собесе расскажут
> пост директора по инфраструктуре"смотрите, как я умею!"
Это... какой-то позор?
Позорище
Смотрите как могу:> -B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x
дрянная идея. Это контейнер который будет большинством обезьянок использоваться as-is.Вот то что байткод брался из хомяка горе-разработчика вместо компиляции в закрытом окружении докера - это конечно минус.
Но ничуть бы не помогло от гения-директора обходящего защиту от роботов патамуштамагу. Он бы и руками не забыл добавить внутрь образа.
> не учёл, что упоминание токена прокэшировалось в предкомпилированном файле с байткодом, который затем попал в docker-образВ пакетном менеджере Nix этой проблемы нет: перед сборкой все неигнорируемые файлы копируются в /nix/store, так что сборщик видит только реально исходные тексты. Любопытно, но так никто и не догнал Nix ни в этом, ни во всех остальных отношениях. Хотя Nix из далекого 2004.
> перед сборкой все неигнорируемые файлы копируются в /nix/store, так что сборщик видит только реально исходные текстыты не поверишь, но в докере тоже сборщик не видит игнорируемые файлы
Видит. Другое дело, что у докера свой собственный .dockerignore, который конечно же никто не будет синхронизировать с .gitignore. Отсюда имеем, что имеем ("it's what it's").
А что его синхронизировать, если git поддерживает симлинки?
Docker не поддерживает dockerignore в подпапках. У gitignore больше синтаксиса (но можно ограничиться подмножеством обоих).
Люди не готовы к будущему.
Да во всех дистрах сто лет уже собирают пакеты (и, соответственно, ПО) в clean chroot. Причем, там chroot на стероидах. А тут опять какой-то стартап на армейской коленке освоил технологии "дидов" и выдаёт это за инновацию. Linux namespaces (bubblewrap, systemd-nspawn или что-нибудь ещё), хотя бы, к своей псевдоизоляции на симлинках прикрутитите, как у других, а потом выпендривайтесь, никсоё^Hводы. А то любая программа может прочитать и вызвать по абсолютному пути /nix/store/blablabla всё, что пожелает.
Там ровно это и имеется, при сборке пакета он не может обращаться к чему-либо кроме своих зависимостейИсключение - интернет, но в этом случае должен быть известен хеш полученного пакета, т.е чтобы curl вызвать нужно указать какой хеш будет у скачанного файла.
> Там ровно это и имеетсяТам самый обычный, только костыльный, chroot без изоляции.
> какой хеш
find /nix -name \*curl
> Там самый обычный, только костыльный, chroot без изоляции.Да что ты такое несёшь
Там и userns, и netns, и mountns, и seccomp, и монтируются в песочницу только зависимости, и доступа в песочницы не имеет никто кроме рута и nix демона.
Доступ в интернет доступен только для сборки тех пакетов, для которых прописан конечный хеш, скачиваемый файл = пакет который для сборки дёргает curl, чтобы скачать файл нужно заранее прописать хеш файла который будет скачан.
Анализ показывает что всем пофиг на эти токены и дыры типа выхода за границы буфера. Это только маленьких детей пугать.
А зачем ".pyc" файлы в гит добавлять? 0_0
ещё один! вы что-ли там совсем читать разучились? в какой гит?> Исследователи из компании JFrog обнаружили в составе Docker-образа "cabotage-app" токен ...
по буквам "обнаружили в составе Docker-образа"!
А докер образ создаётся CI/CD при выполнении пуша.
> А зачем ".pyc" файлы в гит добавлять? 0_0Перевод с питона на русский.
> По сообщению представителей репозитория PyPI токен был создан в 2023 году для разработчика ewdurbin (Ee Durbin), который занимает в организации Python Software Foundation пост директора по инфраструктуре.Жёваный стыд.
"а вы точно разработчик? Скажите что-нибудь на разработческом!"
"- дайте мне токен с полным доступом ко ВСЕМУ!"
> "а вы точно разработчик? Скажите что-нибудь на разработческом!"дайте рута на прод
Переписка из чатика python software foundation
> "а вы точно разработчик? Скажите что-нибудь на разработческом!""- дайте мне токен с полным доступом ко ВСЕМУ!"
Эт только уровня принципалов, все что ниже, проще на "разработческом"
- "Равиндра, игеде здесь у вас кинопка NEXT-NEXT... ?"
- Docker-образ с токеном
Девляпс-ляпс-ляпс.
и один ключ от всех дверей - даже не под ковриком, а просто в замке всегда торчит.ну зато нигры-норкоманы очень важны для человечества. Про фрипластелин что-то не вижу только. Недоработочка.
Всё на месте https://durbin.ee/
> Всё на месте https://durbin.ee/а, и точно, всьо.
Этого - точно в директора!
"и чтобы обойти лимиты, выставляемые для анонимных обращений к GitHub, временно добавил свой рабочий токен в код. Перед публикацией написанного кода токен был удалён, но разработчик не учёл, что упоминание токена прокэшировалось в предкомпилированном файле с байткодом, который затем попал в docker-образ"Специалисты которых мы заслужили! Так победим! xD
не специалисты а цельные директора по инфраструктуре.
Т.е. тот самый человек, который должен был первым йопнуть кулаком по столу со словами "какой на... общий ключ от всех дверей?! Вы что тут - совсем ухи поели?! Быстро накодить проверку чтоб такие ключи вообще сразу блокировались при попытке их создать."
> не специалисты а цельные директора по инфраструктуре.
> Т.е. тот самый человекгде Вы видали вменямых топтунов?
ван Россум ушёл в Microsoft, вот результат
ну блин, у чувака - пенсия, дача, рыбалка...С токенами и дыркерами вон этот пусть пердолится... blm с фрипластелином. Понятно что Опоссум от них сбежал нафиг.
> С токенами и дыркерами вон этот пусть пердолится... blm с фрипластелином. Понятно
> что Опоссум от них сбежал нафиг.Э нет! Напоссал и сбежал? Так не пойдет, так что - вот - брыкающегося и хрипящего его приволокли назад, объяснив что для него ад - уже начался: это гуано он будет разгребать вплоть до смерти или безумия, whichever comes 1st.
> Специалисты которых мы заслужили! Так победим! xDИзвините, им лениво заморачиваться с приземленными вещами типа обработки ошибок или подчистки за собой в байткоде - или хотя-бы настройки .gitignore, чтоли, как это нормальные разработчики делают.
В большой проект требуется директор по инфраструктуре. Требования к кандидату:
- Уверенное знание Python
- Опыт работы с контейнерами
- Желание развиваться (будет плюсом)
А квота для minorities у вас есть?!
Они и так проходят по квоте, у них один из ведущих разработчиков не так давно стало Alyssa-ой. Видимо, когда оно выбирало имя, смотрело на другую Alyssa-у. А казалось бы, сторонник "консервативных ценностей", работало раньше на Boeing Defence Australia, о чём гордо упоминает в своём резюме.
> Они и так проходят по квоте, у них один из ведущих разработчиков
> не так давно стало Alyssa-ой. Видимо, когда оно выбирало имя, смотрело
> на другую Alyssa-у. А казалось бы, сторонник "консервативных ценностей", работало раньше
> на Boeing Defence Australia, о чём гордо упоминает в своём резюме.а потом - е6анулось... а мы удивляемся, чего у них один токен от всех замков.
Жги, Г-ди!
Требования к гендеру?
> разработчик не учёл, что упоминание токена прокэшировалось
> в предкомпилированном файле с байткодом, который затем
> попал в docker-образ.Как оно могло прокешироваться? Изменил исходник, значит и содержимое кеша должно измениться при запуске? Или он не проверял (не запускал)? Не проверял, потому что не изменял исходник вручную, а откатил коммит?
может даже и запускал - в уже собранном докер-контейнере.
А в образе спокойно лежал и пах старый бинарник.Что образ при сборке не компилился - ну на фоне существования "токена-от-ВСЕГО" - право же ж, такая мелочь. Некогда, некогда ждать пока он скомпилируется, девляп-ляп-ляп-ляп и в продакшн!
Токен это нормально же. Во-первых, ныне 2к24. Во-вторых, это не os.system("sudo curl"), или как там оно делается на пихоне, "прокешировался". Печалит, что ни в 29a, ни в BHC уже не написать по этому поводу.
Запуск не вызывает ребилд контейнера.Но более важный вопрос: с какого рожна, образ заливается с машины разраба, а не собирается на билд-сервере?
вообще-то должен бы был - но текущего контейнера. А образ где был (в дыркер хапе) там и лежит, всем на радость.> Но более важный вопрос: с какого рожна, образ заливается с машины разраба, а не собирается на
> билд-сервере?ну это ж ах...еть удобно отлаживать, да?
Отлаживать удобно локально, а продовая сборка должна выполняться автоматически и не на машине разраба.
Так в каком именно месте в этой схеме технологическое отверстие? Это зиродей или во всю уже эксплуатируют ситуацию, когда в исходнике написано одно, а кеш не когерентен и исполняется чёрти че?
> Так в каком именно месте в этой схеме технологическое отверстие? Это зиродей
> или во всю уже эксплуатируют ситуацию, когда в исходнике написано одно,
> а кеш не когерентен и исполняется чёрти че?ему не надо исполняться. Надо просто кому-то неленивому посмотреть что там понакэшировалось. Такой нашелся. К сожалению, не сделал forced push пустого места с приветом blm и фрипластелинам с последующим gс, придется ждать следующего.
>> Так в каком именно месте в этой схеме технологическое отверстие? Это зиродей
>> или во всю уже эксплуатируют ситуацию, когда в исходнике написано одно,
>> а кеш не когерентен и исполняется чёрти че?
> ему не надо исполняться.Если ему не надо исполняться, зачем он тогда вообще нужен?) Об этом кто-то вообще подумал?))
> Надо просто кому-то неленивому посмотреть что там понакэшировалось.
> Такой нашелся.Наверное, дело было примерно так:
- Коллега, давайте таки поищем где-нибудь новый xz-троян!
- Не думаю, коллега, что кто-то будет ходить по проторенным дорожкам!
- Что же нам тогда делать?
- А давайте поищем в самом неожиданном месте!
- Гениальная идея! Предлагаю посмотреть .pyc файл!
- Во, точно! нашёл!Ну не может же быть, что у них это дело поставлено на поток, и опубликовали эпичный но бесполезный для них фейл. Это конспирология! ;)
> Если ему не надо исполняться, зачем он тогда вообще нужен?это кэш, блжд. Оставшийся от предыдущего запуска.
> - А давайте поищем в самом неожиданном месте!
место совершенно ожидаемое, куча "исследователей безопастносте" развлекается grep X-Auth-Token и подобным по шитхабу и дыркерхапу, кто-то просто налажал с угадавом типа файла и случайно залез в бинарники (или не налажал и не случайно, а просто имел время и вдохновение - машина железная, пусть греп потрудится). А оно там возьми и найдись!
> Ну не может же быть, что у них это дело поставлено на поток, и опубликовали эпичный но
> бесполезный для них фейл.атака на supply chain чуть ли не всей цивилизации пакости - и вдруг - бесполезная?
>> Если ему не надо исполняться, зачем он тогда вообще нужен?
> это кэш, блжд. Оставшийся от предыдущего запуска.Вопрос не "что", а "зачем". Зачем что-то "оставшееся" копируется куда-то, ещё и автоматически.
>> - А давайте поищем в самом неожиданном месте!
> место совершенно ожидаемое, куча "исследователей безопастносте" развлекается grep X-Auth-Token
> и подобным по шитхабу и дыркерхапу, кто-то просто налажал с угадавом
> типа файла и случайно залез в бинарники (или не налажал и
> не случайно, а просто имел время и вдохновение - машина железная,
> пусть греп потрудится). А оно там возьми и найдись!Или так и было задумано: массы нажимают левой пяткой кнопочку, кеш копируется. :) А лажали те, кто оптимизировал поиск, исключая неподходящие типы.
>> Ну не может же быть, что у них это дело поставлено на поток, и опубликовали эпичный но
>> бесполезный для них фейл.
> атака на supply chain чуть ли не всей цивилизации пакости - и
> вдруг - бесполезная?По сравнению с остальными, про которые не написали в новостях.)
> Вопрос не "что", а "зачем". Зачем что-то "оставшееся" копируется куда-то, ещё и автоматически.потому что COPY allthishit.tar /
а в нем целиком хомяк или вообще вся виртуалочка разработчика-директора, потому что таков путь.Причем если после этого в том же докерфайле зачем-то еще запустить скопированное - оно кэш перегенерит, но в нижнем слое оригинал-то останется на память.
> Или так и было задумано: массы нажимают левой пяткой кнопочку, кеш копируется.
ну дыркер примерно так и работает, но оно в staging копируется, насколько я понимаю - без явного ADD или COPY его содержимое в образ не попадет ни при каких условиях.
Пароли ненадёжно, говорили они. Нужно по ключам, токенам.
Главная проблема паролей - записывание их на бумажки и создание намеренно мастер-паролей. А вот это вот, по недосмотру оказывается в коде, в данных.
что значит "по недосмотру"? Оно и может быть только в коде или данных в этом коде, в том и принципиальное отличие от пароля, который должен бы быть только в голове, ну или хотя бы вот, на листочке приклеенном к монитору, как у меня.
> Нужно по ключам, токенам.Да токены по большому счету только защита от паролей класса "маша", "12345678", т.к. народ неизлечим. Тоже самое что и с app-passwords от мелософта и гугли
А пароли по недосмотру оказываются в ps aux.
> А пароли по недосмотру оказываются в ps aux.там и токен окажется, не вижу никакой разницы.Тут вон уже насоветовали совать его в environment
(лучше сразу в докерфайл - надежно, на века)
> лучше сразу в докерфайлВ каком- то смысле, тебя услышали
>> лучше сразу в докерфайл
> В каком- то смысле, тебя услышалида, но можно же было сделать - КРОСИВО!
(и дыркерфайл закомитить кстати в гит, одним выстрелом отстрелить два яйца)
>>> лучше сразу в докерфайл
>> В каком- то смысле, тебя услышали
> да, но можно же было сделать - КРОСИВО!
> (и дыркерфайл закомитить кстати в гит, одним выстрелом отстрелить два яйца)Может скоро и такое узреем
>Токен был найден в бинарном файле "__pycache__/build.cpython-311.pyc" с прокэшированным скомпилированным байткодом.Какого хрена вообще переменные окружения сохраняются в файл с прокешированным байткодом?
В новости шесть параграфов.
Четвёртый - код, который отвечает на твой вопрос.Ты смог прочитать только три параграфа? Или сдался сразу после картинки?
После заголовка
Что-то я не понял. Можно же указывать время жизни токена? Указал время жизни в месяц — и всё! Какие проблемы?
Как какие - через месяц же сломается все, вот какие!
что сломается?
всё, что не ясно ?
> всё, что не ясно ?У меня ничего не ломается. Всё работает.
>обнаружили в составе Docker-образа "cabotage-app"Имели в виду sabotage, но клавишей промахнулись.
Виновник - саботажник, который должен быть с позором уволен.>Токен предоставлял доступ с правами администратора ко всем репозиториям и организациям проекта, включая все репозитории организаций pypi, python, psf и pypa
1. Почему вообще такой токен был сгенерирован? Зачем этому токену доступ к пушу кода?
> в процессе разработки инструментария cabotage-app5 на своей локальной системе столкнулся с ограничениями интенсивности доступа к API GitHub при выполнении функции автоматизированной загрузки файлов из GitHub, и чтобы обойти лимиты, выставляемые для анонимных обращений к GitHub, временно добавил свой рабочий токен в код.
2. Виновник якобы тестировал свой недокод на особо важно проде особо важной организации с особо важными репозиториями.
3. Питоньи библиотеки для работы с GitHub API подхватывают токен автоматически из переменных окружения. Это сделано потому. что GitHub Actions ставит временный per-pipeline токен в переменную окружения, и он нужен почти всегда. Об этом знает каждый, кто работал с GitHub API и GitHub Actions из питона. Для того, чтобы предоставить токен, не нужно его хардкодить!
Для предотвращения ситуации нужно изменить модель токенов.
1. Одно разрешение - один токен.
2. В начале каждого токена должно быть в человекочитаемом виде захардкожено, какое разрешение он предоставляет. Предложение: 4 ASCII-символа на тип, потом вертикальная черта, потом сам токен.
3. либы получают не один токен, а ворох токенов.
4. Либы должны парсить начало токена и для каждый операции использовать нужный токен из набора
5. при генерации токена с вогрошом разрешений ... гитхаб должен отдавать конкатенацию индивидуальнох токенов, разделённых разделителями. Должно быть разрешено отправлять эту конкатенацию в качестве токена, бэкенд разделит и разберётся, какой из токенов подходит. Предложение - для конкатенации использовать двоеточие в качестве разделителя. При этом отправка таких токенов на бэкенд deprecated с самого начала, с жёсткой датой, когда это перестанет быть допустимо.
6. либы тоже должны уметь разделять контакенацию на ворох токенов, только для них это не deprecated, а штатный режим работы.
7. либы должны предоставлять API для сбора и разбора колбасы их токенов.
8. должен предоставляться CLI-инструмент для сбора и разбора колбасы их токенов.
9. Старые токены становятся deprecated, и очень вскоре после создания нового механизма инвалидируются. При этом переход на временные сардельки не требует изменений со стороны софта - только перегенерации токенов.А теперь как это помешает засунуть весь ворох. Ответ - никак. От высокопоставленного саботажника не защитит ничего в принципе. Зато честному долбоящеру, которому до ужаса лень генерить новый токен, будет меньше стимулов засовывать универсальный высокопривелигированный токен (который теперь будет колбасой) в свой код, легче его разрезать инструментом и засунуть только нужный подтокен.
> Виновник - саботажник, который должен быть с позором уволен.не саботажник, а директор. Сам кого хочешь уволит!
> 1. Почему вообще такой токен был сгенерирован? Зачем этому токену доступ к
это вопрос который директору задавать нельзя.
> 3. Питоньи библиотеки для работы с GitHub API подхватывают токен автоматически из
> переменных окружения. Это сделано потому. что GitHub Actions ставит временный per-pipelineони в дыркер автоматически не передаются. А документацию директору читать некогда.
> Для предотвращения ситуации нужно изменить модель токенов.
тебя не назначат директором, не волнуйся так.
Python - всё? Новость сделала мой день.
вы понимаете что произошло, питон полностью скомпрометирован, его теперь только в помойку.
И сколько тогда реальных программистов останется?
А какая связь? Столько же и останется, сколько было, реальных-то.
> А какая связь? Столько же и останется, сколько было, реальных-то.:))) 10-0
> А какая связь? Столько же и останется, сколько было, реальных-то.ну, а кодить тогда кто будет?!
Реальные - заняты. Кто пиццей торгует, кто чем. Самые ленивые - в нвидии, драйвер для линукса пилют.
>его теперь только в помойкусоображающие люди это давно поняли, поэтому 70% корпорат. приложений - на Java
java разработчики точно такие же питонисты, даже ещё в большем неадеквате. Вот пример
Там тоже нашли токен от всех реп?
Чукча не читатель? Там токен от всего прода
> Чукча не читатель? Там токен от всего продатолько у дура4ков которые логают нефильтрованный юзеринпут.
Чему вы не рады? Каждый мог поправить питон как надо. Вы упустили свой шанс, вот и беситесь.
> удалён 11 июня 2024 годаИ зачем? Как теперь получать "доступ с правами администратора ко всем репозиториям и организациям проекта, включая все репозитории организаций pypi, python, psf и pypa"?
> упоминание токена прокэшировалось в предкомпилированном файле с байткодом, который затем попал в docker-образdocker упрощает деплоймент, ога ))
очердной костыль и точка отказа
> Проведённый разработчиками Python аудит активности в репозиториях на GitHub не выявил сторонних попыток доступаа жаль. типичный современный айти. разработчики, которые не знают, как на низком уровне работает их язык, дыркер... вот нашелся бы какой хакер на них.
>> Проведённый разработчиками Python аудит активности в репозиториях на GitHub не выявил сторонних попыток доступа
> а жаль. типичный современный айти. разработчики, которые не знают, как на низкомдык. они и провели аудит активностей. ничего не аудитится, потому что аудитлог стерт. Все хорошо и просто прекрасно.
> уровне работает их язык, дыркер... вот нашелся бы какой хакер на
> них.главное чтоб нашедшиеся не передрались
>Python, PyPI, Python Software FoundationПопытался представить себе последствия если бы токен нашли blackhat. Индустрию долбануло бы.
На сей раз пронесло. Зато теперь плохие ребята знают еще одно место где надо искать.
>На сей раз пронесло.С чего ты решил, что пронесло? Как-то не очень верится в честное слово этих товарищей после такого эпичного обсера своих штанов. Кто же в этом признается, может они сейчас чтобы не наводить панику по тихому делают аудит?! Если все же пронесло - промолчат, а если нет - запасается попкорном.
>>На сей раз пронесло.
> С чего ты решил, что пронесло?да, я вот тоже хорошо информированный оптимист.
> в этом признается, может они сейчас чтобы не наводить панику по
> тихому делают аудит?! Если все же пронесло - промолчат, а еслиКак будто они - умеют?!
Тебя б так пронесло, подумал Мюллер.
то ли ещё будет ...
> На сей раз пронесло.Тебя бы так пронесло, подумал Борман (ц)
> Токен был найден в бинарном файле "__pycache__/build.cpython-311.pyc"
> с прокэшированным скомпилированным байткодом.Да куда питонистам байткод изучать? У них там полет мысли, высокие концепции, не до этого им. Вот прототипов бы скорей-быстрей!
> занимает в организации Python Software
> Foundation пост директора по инфраструктуре.Какой ЯП такая и инфраструктура с директорами.
> Токен предоставлял доступ с правами администратора ко всем репозиториям
> и организациям проектаВсе правильно сделал. А потом питонисты удивляются что их считают, как бы это сказать, не гроссмейстерами, чтоли.
Я просто оставлю это здесь.https://mastodon.social/@EWDurbin/110531653383028239
> python, infra, cloud, etc. got a smol project you'd like to get whipped? contractin@durbin.ee
> Автор кода пояснил, что в процессе разработки инструментария cabotage-app5Вот, сам признался что занимался саботажем, все бы так
Я думал, что такая нацеленность на результат ещё не везде со стороны молодых, да ранних (в основном молодых, как мне кажется). Ан нет. Условное "дайте мне рута, разбираться некогда, надо работать в локере на питоне и джанге" процветает уже везде.
это эджизм. Давайте тебя заканселим!
А вы токен для этого предъявите
И ни слова извинений и посыпания головы пеплом. Ваще пофиг. Главное в конце написать какое мы прекрасное комунити.