AI-Generated GitHub Copilot “Autofix” Allowed Compromise of Snowflake's Jira 🔥 Горячее
AI-ассистент GitHub Copilot случайно внёс критическую уязвимость в репозиторий Snowflake, заменив безопасный шаблон обработки данных на прямую подстановку пользовательского ввода в shell-скрипт. Это позволило любому пользователю GitHub выполнить произвольный код через создание специально оформленного issue — уязвимость была активна всего пять дней, пока Wiz Red Agent, автономный AI-инструмент для поиска уязвимостей, не обнаружил и эксплуатировал её, получив доступ к внутренней системе Jira Snowflake через украденный токен. AI-ревью не заметило опасность, потому что не понимало исторический контекст: ранее использовавшийся метод с env: и jq был специально добавлен для предотвращения инъекций.
Snowflake оперативно устранила уязвимость в тот же день, сменить токен и подтвердила, что Wiz был единственным субъектом доступа. Инцидент стал ярким примером рисков, связанных с автоматизацией кода: AI-агенты могут удалять защищающие паттерны, не понимая их назначения. Важно внедрять «охранительные барьеры», запрещающие AI заменять структурированные парсеры на прямую подстановку строк. Уязвимость не была следствием человеческой ошибки — она родилась в AI-автоисправлении, что ставит под сомнение надёжность текущих практик код-ревью с участием ИИ.
Комментарии (138)
Уязвимость возникла не из-за AI, а из-за слабой проверки изменений, устаревших практик в GitHub Actions и некорректной обработки null-значений в шаблонах, что усиливает риск доверия автоматическим исправлениям без ручного аудита. AI не создаёт новых типов уязвимостей, но ускоряет их появление, делая распространёнными существующие ошибки: интерполяцию пользовательского ввода в shell-командах через ${{ }} без экранирования, использование curl вместо надёжных действий для взаимодействия с Jira (технический долг), и логику с `github.event.pull_request` в событиях `issues` — где `pull_request` всегда null, что возвращает `false` при любом условии. Оригинальный шаблон с `env` + `jq` был безопасен: переменные передавались через окружение, а не вставлялись в shell-строку. AI заменил его на опасную подстановку в одинарные кавычки. Ручной аудит диффов стал узким местом: AI упрощает генерацию изменений, но стоимость проверки не снизилась. Культура ревью «LGTM» без анализа превратила AI в просто замену человека в цепочке, не снизив риски. Советы: — Использовать статический анализ (например, zizmor) в CI для выявления template-injection до слияния. — Минимизировать логику в GitHub Actions, вынося сложные операции в отдельные скрипты. — Избегать интерполяции пользовательского ввода в shell через ${{ }} — использовать env-переменные и jq. — Системы, обрабатывающие пользовательский ввод в shell, должны fail-closed при null-значениях — поведение GitHub Actions по умолчанию небезопасно. AI обнажил системные слабости: устаревшие действия, отсутствие статического анализа и слепое доверие к автоматическим изменениям.
A shell colon does nothing. Use it anyway 🔥 Горячее
Колонка — это пустая команда, которая ничего не выводит, но позволяет применять расширенный синтаксис параметрического расширения ${name:?msg}. Вместо четырёх строк проверки обязательных параметров её можно заменить на : "${1:?missing argument, aborting.}", а для переменных задавать значения по умолчанию через : "${DATA_DIR:=/var/data}". Она также служит для обнуления файлов — : > error.log, а комбинация : > error.log > access.log одновременно очищает несколько файлов. Благодаря этому скрипты становятся короче и читабельнее, а диагностическое сообщение содержит имя переменной.
Помимо проверок, : используется как placeholder, где синтаксис требует команду, но действие не нужно. Например, ( : < dataset.json ) && echo YES проверяет читаемость файла, а ( : >> result.json ) && echo YES — его записываемость. В обработке сигналов её можно задать в trap : INT, делая прерывание безопасным. В Git‑ алиасах её применяют для интерактивного rebase: riq = -c sequence.editor=: rebase --interactive. Исторически : восходит к 1971‑му Thompson‑shellу, где оно было меткой и первым комментарием; сегодня его называют «двумя глазами, полными любви», подчёркивая простоту и мощь этого простого символа.
Комментарии (117)
Тред обсуждает использование колона в shell-скриптах: некоторые считают его вредным для читаемости и поддержки, другие — полезным для сокращения кода. @olexsmir рекомендует его для установки значений по умолчанию: `: ${DOTFILES_PATH:=$HOME/.dotfiles}`. @kps предлагает применять колон для форматирования вывода команд, упрощая копирование. @orphereus и другие критикуют колон как излишнее усложнение и признак плохого дизайна языка, предлагая ограничить его использование.
Gemini CLI Tips and Tricks for Agentic Coding 🔥 Горячее
Репозиторий собирает практические советы и трюки для работы с Gemini CLI — командной строкой для модели ИИ Gemini от Google. Он охватывает оптимизацию промптов, автоматизацию задач, интеграцию с shell-скриптами и продвинутые техники, такие как цепочки вызовов, обработка ошибок и кастомные алиасы. Авторы подчёркивают, как ускорить разработку: например, генерация кода за секунды или анализ логов одним вызовом.
Ключевые фичи включают примеры для новичков (простые запросы) и экспертов (мультимодальные входы, fine-tuning через CLI). Репозиторий обновляется сообществом, с 50+ tips, включая хитрости вроде --stream для реального времени и JSON-вывод для парсинга. Идеально для devops и скриптеров: экономит часы рутины, повышая продуктивность на 3–5x по отзывам.
Комментарии (129)
- Большинство критикует Gemini CLI за ненадёжность, медленность (10-80 сек на простые запросы), слабые инструменты и циклы ошибок.
- Предпочтение Claude Code и Codex как более эффективным агентам для кодирования; модель Gemini 3 хвалят, но CLI — нет.
- Жалобы на игнор файлов, отсутствие плана, фрагментацию CLI по моделям и быстрое устаревание советов.
- Желание LLM-агностичного агента и стандартизации; некоторые советы полезны, но "крик" на AI часто работает лучше.
The terminal of the future 🔥 Горячее
Современные терминалы ограничены решениями, принятыми ещё в 1980-х, и состоят из четырёх компонентов: эмулятора терминала, псевдотерминала (PTY), оболочки (shell) и запускаемых программ. Автор отмечает, что внутренняя структура терминалов — это "куча", где многие решения невозможно изменить из-за исторического наследия. В качестве примера приводится цитата Джулии Эванс: "Внутренности терминалов — это беспорядок. Большая часть этого именно такая, потому что так кто-то решил в 80-х, и теперь это невозможно изменить".
В качестве альтернативы традиционному терминалу автор предлагает использовать Jupyter Notebook как модель для будущего терминала, предлагающую такие возможности, как высококачественное рендеринг изображений, функцию "перезапустить с начала" и возможность редактирования представлений кода и вывода. Статья описывает четыре этапа создания такого терминала: транзакционную семантику, постоянные сессии, структурированный RPC и интерфейс, похожий на Jupyter.
Комментарии (146)
- Обсуждение охватывает широкий спектр тем: от философских вопросов о том, что такое терминал и каким он должен быть, до конкретных технических деталей, таких как поддержка изображений, буферов и сессий.
- Участники обсуждают, какие функции действительно необходимы, и какие являются излишеством, и как они могли бы быть реализованы без нарушения обратной совместимости.
- Обсуждаются такие темы как встроенная поддержка редактора, возможность встроенной поддержки графики и мультимедиа, и как эти функции могли бы быть реализованы без нарушения существующих стандартов.
- Участники также обсуждают, какие функции могли бы быть реализованы в будущем, и какие из них уже реализованы в других системах, таких как Jupyter и Emacs.
- Обсуждается, какие функции могли бы быть реализованы в будущем, и какие из них уже реализованы в других системах, таких как Jupyter и Emacs.