It it's about as safe as any other standard1 installation method as long as you:
- Use HTTPS (and reject certificate errors)
- Are confident in your certificate trust store
- Trust the server you're downloading from
You can, and should, separate the steps out -- download the script2, inspect it, and see if it's doing anything fishy before running the script you downloaded3. This is a good idea. It won't hurt anything if you do it and you might catch a compromise, which you can report to the source and the community at large. Be prepared to dig through quite a lot of Bash, if my experience with such things is any indicator. You can also try 'expanding' it, downloading any scripts that it would separately and tweaking the script to call those, if you're particularly worried about evil servers, but at some point you have to decide to just use a different server if you trust the first one so little.
Be aware that if the server (deb.nodesource.com
) is compromised, you basically have no recourse. Many package managers offer to verify GPG signatures on packages, and even though a fundamental part of the keysigning architecture is broken, this does still by and large work. You can manually specify the CA for wget and curl, though this only proves you're really connecting to that server, not that the server is serving safe code or that it's legitimate code from the creators.4
If you're worried about arbitrary code execution, APT definitely allows that, and I'm fairly confident both Homebrew and Yum do as well. So comparatively, it's not unsafe. This method allows greater visibility; you know precisely what's happening: A file is being downloaded, and then interpreted by Bash as a script. Odds are good you have enough knowledge already to start investigating the script. At worst, the Bash may call another language you don't know, or download and run a compiled executable, but even those actions can be noticed beforehand and, if you're so inclined, investigated.
As a side note, given that a lot of the time you need to install things with sudo
, I don't see its use here as any special concern. It's mildly disconcerting, yes, but no moreso than sudo apt install ...
.
1: There are significantly safer package managers, of course -- I'm only talking about standard ones like APT and yum.
2: ...while being careful with your copy/pastes, naturally. If you don't know why you should be careful with your copy/pastes, consider this HTML: Use this command: <code>echo 'Hello<span style="font-size: 0">, Evil</span>!'</code>
. To be safe, try pasting into a (GUI) text editor, and ensure you copied what you think you did. If you didn't, then stop trusting that server immediately.
3: You can actually detect whether the script is just being downloaded or being downloaded-and-executed, because interpreting a script with Bash takes a different amount of time than saving it to a file, and Linux's pipe system can "back up", which can make those timing differences visible to the server. If you ran the exact curl | sudo bash
command they gave, your examination is (at least if it's a malicious server...) meaningless.
4: Then again, it looks like NodeSource is creating some sort of custom installer, which wouldn't be signed by the Node team anyway, so... I'm not convinced that it's less safe in this particular case.
alias brawndo='curl $1 | sudo bash'
curl $1
doesn't look at an argument to thebrawndo
alias, it looks at your shell's current argument list, which for interactive shells is usually empty. You probably want a function:brawndo() { curl "$1" | sudo bash; }
-- or, to pass arguments past the first to the received script:brawndo() { local url; url=$1; shift; curl "$url" | sudo bash -s "$@"; }
(of course, all that is said with my shell hat on; with my security hat, don't do any of this).