SaltStack Mining Attack
saltexploit.com
saltexploit.com
WTF does that mean? Our salt implementation is on an entirely private network, so why would I be more likely than not to be compromised already?
----
Edit: Re-downvotes -- This is a sincere question. Is there some evidence that the majority of salt implementations are compromised, or some mechanism by which this hits private networks? Or is that line just for dramatic effect?
IMO, Salts best feature is probably running with the Master / Minion setup because it connects out to the master. Masterless is handy for using in conjunction with Vagrant, Packer, or another provisioning tool not so much for managing a the lifecycle of a server / OS.
In production, an outsized number of companies are using SaltStack a certain way.
The reason is because of the way we all evaluate business risk. I could have said that out of all of the companies I've worked with using Salt that have compliance requirements, 100% of them are using it Masterless, but then some smart-ass would have piped up with a "not me" comment.
Your use case makes absolute perfect sense though -- nice!
But apparently there are 6000 people just straight up exposing their masters to the internet:
Some companies need better DevOps apparently
The DevOps grouping doesn't apply too much, Operations-minded staff should be focusing on keeping things locked down.
Unless, you know, you're not hiring those people and instead are hoping that developers take the Ops burden. ;)
Development and Operations are different disciplines and the idea was to remove silos, not make one person responsible for both.
"I found this site called Alexa that lists a bunch of companies that just straight up expose their web servers to the internet. Crazy."
And I have some bad news about how many companies are exposing their VPN servers to the internet too.
You also wouldn't expose your database just because it's password-protected?
I bet all these public servers have a firewall running to protect other services.
Shouldn't be hard to include the saltstack port(s) and whitelist the relevant IP addresses.
Also,the main difference with your example is that the clients that connect to webservers and vpns are either not known in advance or don't have static IP addresses.
Sans the current CVE this is otherwise a service that is safe to expose to adversarial networks.
What we did so far:
We’ve secured the impacted SaltStack service by updating it and adding additional IP filtering, allowing only our servers to connect to it.
So clearly unrestricted access wasn't a necessity.I understand it's a pain, I've been running a 1000+ server stack with puppet on a public network and relied on iptables to secure it. But I'd rather cope with the daily iptable rules update than having to fight a 0-day exploit...
I don't run firewalls. If a service doesn't need to be exposed, the port isn't open. Means no worrying about who has access to the wifi (because that's outside the security boundary) and no mucking about with VPNs when accessing remotely.
That's what these Saltstack users thought too until this week.
would or could often have a vpn tunnel back to some static infrastructure, this and not the public network can be used for mgmt
> WTF does that mean?
The website assumes that if you dropped by or googled the vulnerability, it's because you had saltstack exposed to the public internet.
You don't have to react so harshly to that turn of phrase.
> Even if you didn't notice any unexpected symptoms, please: nuke and restart.
If I were writing this, I'd probably write something like "On May x, a remote-code-execution in (all versions?) public salt-masters (not minions?), was unveiled. Shortly thereafter, actual exploitation in the wild is being used. If your salt installation uses a salt-master, and it's internet-reachable, it may already be compromised, along with much your infrastructure. Section 2 is how to see if you are infected, and Section 3 is how to remove the infection."
That's much worse. That implies there is a reliable way to detect and remove the infection. That's not the case. This website included some known attacks and such. There's a high chance that there were attacks of this vulnerability with additional payloads.
There's no way to know if you were hit with a rootkit that persists itself in the bootloader or other parts of your system. There's no way to know if you were infected or not.
The only way to be sure is to nuke the machine, as they said.
Security advice should always err on the right side for a naive reader.
Now, nine months after dropping SaltStack, my colleagues are editing the docs I've created, and more importantly, they're also writing their own. That's a huge win. What I've lost in terms of personal productivity, I've regained in terms of wider participation in our standardization and documentation efforts.
I might slowly re-introduce IT automation technologies, maybe something more popular like Ansible or Docker, but only after making sure the rest of my team has a solid understanding of general IT automation concepts. I think we're on the right track. I had a colleague today ask me about what Python programming certification they should get, so I pointed them toward Google's Python-based IT automation course on Coursera. I supported another colleague's efforts to create a library of standard server images based on our internal deployment standards for one of our private clouds, and I'm encouraging them to expand that work to our other data centers. And so on. The team as a whole works better together, so that's where I'm staying focused.
The reality is that devops toolchains are really complex. For example, to use SaltStack the way I had things set up, it meant learning:
- SaltStack's domain-specific programming language, which amounts to writing Python in YAML
- their macro preprocessor, Jinja, which has completely different syntax and semantics than their DSL
- a programming text editor that supports YAML and Jinja
- Git and GitHub
- secrets management (and there were huge risks here)
- the general concepts of IT automation and infrastructure-as-code
Learning (never mind teaching) that tech stack is really hard. For example, the Google IT Automation with Python certification on Coursera is an 8-month-long course. That's just one bullet point on the above list, and that list doesn't include all the things I wanted to do on top of SaltStack, namely the continuous integration/continuous testing stuff, which would involve learning:
- the Chef InSpec DSL, which is based on Ruby
- branching and tagging
- release engineering
- test-driven development as a software engineering methodology
- software engineering methodology in general
We were struggling with even just writing good documentation, but there I was asking everyone to write good code. That's orders of magnitude harder. It was too much, like asking somebody to run a marathon without any training. I don't care how fit you are. That's just not going to happen.
https://labs.f-secure.com/advisories/saltstack-authorization...
I can take AES256 and make it output the image here: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation...
That's not supposed to happen. The part where homebrew diverges from cryptography is that the former involves engineers like us connecting buzzwords together to produce images like the Wikipedia article, the latter involves complex math and rigorous peer review.
AES-256?
It definitely has them however.
Some of these bugs aren't even that old
Sure, and that is bad, but the exposure is still way smaller. Let's say that Ansible has a bug that allows code execution on my machine by any target server or API, and Salt has a bug that allows code execution on the master server. In that case, the salt server will be owned by script kiddies within hours and the only way to stop it is me killing it or restricting access. But at the same time, the Ansible bug can't be passively exploited without me running it, and can only be exploited by my own servers or vendors when I decide to interact with them. I don't actually expect AWS/DO/whoever to attack me, and my own servers could be compromised but that's still a much less likely jumping attack.
As described inthe relevant entry [0] on Debian's Security Tracker:
> SaltStack RSA Key Generation allows remote users to decrypt communications
The fix [1]:
- gen = RSA.gen_key(keysize, 1, callback=lambda x, y, z: None)
+ gen = RSA.gen_key(keysize, 65537, callback=lambda x, y, z: None)
---[0]: https://security-tracker.debian.org/tracker/CVE-2013-2228
[1]: https://github.com/saltstack/salt/commit/e8ce66cf688b43aeb3e...
Here is the documentation from the RSA.gen_key() function.
def gen_key(bits, e, callback=keygen_callback):
# type: (int, int, Callable) -> RSA
"""
Generate an RSA key pair.
:param bits: Key length, in bits.
:param e: The RSA public exponent.
:param callback: A Python callable object that is invoked
during key generation; its usual purpose is to
provide visual feedback. The default callback is
keygen_callback.
:return: M2Crypto.RSA.RSA object.
"""
https://gitlab.com/m2crypto/m2crypto/-/blob/master/M2Crypto/... int getRandomNumber()
{
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}Adding keys to /root/.ssh/authorized_keys, scp'ing sshkeys, flushing iptables.
I am of course one of the idiots that had it exposed to the internet. I wouldn't do it with a database, but I didn't think twice about salt. Where was my head!
Here's the contents of the sh script for the curious. https://pastebin.com/CbupwQMG
> This message is to customers with VPSs on our legacy SolusVM system.
> At approximately 20:34 eastern (GMT -4) on May 2, recently published SaltStack vulnerabilities (CVE-2020-11651, CVE-2020-11652) were used to launch cryptocurrency miners on our SolusVM host nodes. The attack disrupted various services in order to allocate as much CPU as possible to the miners. SSH and QEMU processes were killed on some of our CentOS 6 KVM hosts, causing extended downtime in certain cases.
> Upon detecting the disruption, we quickly began to re-enable SSH, disable and remove Salt, kill related processes, and boot shutdown KVM guests. After careful analysis of the exploit used, we do not believe any data was compromised.
> RamNode was not specifically targeted, but rather anyone running SaltStack versions prior to the one released a few days ago (April 29).
If someone had code running as root on their machine, they can't say that statement with any confidence whatsoever.
Indeed, I think you need to assume all guests running on the affected nodes are now compromised.
> I'm sad to report that we discovered today that CT Log 2's key used to sign SCTs was compromised last night at 7 pm via the Salt vulnerability.
Several other "high-profile" sites have been compromised as well, including LineageOS and Ghost. I expect we'll hear of many more in the next few days.
---
[0]: https://groups.google.com/a/chromium.org/forum/m/#!topic/ct-...
And then there's someone who saw "salt" and tried to help:
Ansible is very inflexible when it comes to configuration and how you structure your playbooks.
Kubernetes/Helm/Flux only works if you're inside k8s. I don't know why you would be using Salt for that.
Chef Habitat looks nice, but again. I'm doing more then just management of applications.
The only real alternative to Salt is Puppet. So, No. Just no.
But I can chime in on why we use it:
1) First class windows support. (or, as first class as it comes) with no need to enable winrm (which, is much more difficult to do than just installing a salt-minion on first boot)
2) It scales really well; I can run hundreds of thousands of commands in parallel, ansible can't do that; it gets very starved on CPU.
3) It's push based (unlike chef, which you have to run on the client node itself, causing people to cron-job it.
4) it's easily extended; you can write custom modules and it's very easy and pleasant.
---
Now, saying all of that, Salt has warts. Like, hundreds, maybe thousands. It's not uncommon that I find something that's just broken or bugged. Often upgrading fixes 1 bug but makes 3 more. I feel like this might be caused by being an underdog. But it's a real drawback that makes me cautious when recommending it.
I saw Monero mining in JS libraries, now it is in virus form.
Thus, why Monero? Does Monero somehow discourage these "practices"?
Both of these properties make it a relatively safe and profitable avenue for malware authors.
Nothing can really be done about it. Pool operators can ban the wallet addresses of known bot masters from connecting to their pool, but you can't really ban someone from participating in an anonymous decentralised network.