Sudo: Heap-based overflow with small passwords

279 points by thewavelength 2 years ago | 233 comments
  • yakubin 2 years ago
    Sudo must be the program with the largest number of buffer overflows I’ve heard about. That news is repeating itself ever since I remember.

    Maybe a good time to plug doas, a simpler alternative to sudo from OpenBSD folks[1], developed partly due to security fears about sudo. It’s also been ported to Linux and is available in e.g. Alpine and Debian.

    [1]: <https://flak.tedunangst.com/post/doas>

    • Veserv 2 years ago
      To put the relative simplicity into perspective, here is the official Github mirror of sudo:

      https://github.com/sudo-project/sudo

      On the contributors tab:

      https://github.com/sudo-project/sudo/graphs/contributors

      We can see that sudo has been maintained by one person for ~29 years who has single-handedly committed ~2,936,000 changes over that time resulting in a net increase of ~480,000. It is also being actively developed with ~270,000 changes resulting in a net increase of ~40,000 lines in the last twelve months.

      In contrast doas is, just eyeballing it, maybe ~500 lines and at most 1000 lines all together.

      • psychoslave 2 years ago
        From a security point of view, staying small reduces attack surface. So if this holds all the features you need, that’s a valid option.

        It doesn’t remove a bit of how impressive the dedication of Todd C. Miller is of course.

        These are two solutions with a common core goal but greatly different concerns.

        • binkHN 2 years ago
          Todd is a saint for the work that he does here. Ultimately, like many other OpenBSD-related decisions, sudo was replaced by doas because of all the security-related issues with the code. Oftentimes, OpenBSD will replace a very functional solution, that has too many security issues, with one that has far less security issues and is, simply, good enough.
        • Denvercoder9 2 years ago
          > ~2,936,000 changes

          I don't think it makes sense to add all added and removed lines together and call it "changes": for example, this counts even a single character typo fix as 2 changes.

          • efficax 2 years ago
            why on earth is sudo so complicated. All I want it to do is: ensure authorization, raise privileges, call exec.
            • Beltalowda 2 years ago
              > All I want it to do is: ensure authorization, raise privileges, call exec.

              A lot of people do want to do more, especially in some corporate contexts people run very complex sudo setups.

              Consider something like Linode; maybe you want some of the more experienced support people to issue some commands on some machines, without having full control. And you've got a gazillion machines so you don't want to setup each one individually (as well as revoke access once they leave). Things can get fairly complex pretty quickly once you move out of simple settings.

              For my desktop machine, doas is perfect. For our servers it's fine too because we have just a few people with access. But I'm not everyone of course.

              doas was explicitly written to NOT cover all use cases, and that makes it better for the (simpler) use cases it was intended to solve, at the price of not covering other use cases of course.

              • ilyt 2 years ago
                That's the problem. We use sudo that autorizes user by it's SSH key via its auth socket... so we can essentially authenticate sudo via smartcard (Yubikey), and not keep the private key on user machine.

                Some other folks use LDAP to get the sudoers files or even allowed ssh keys itself

                There is also "just run thing as user" but also "set up same way shell would and pretend user logged as different user", first one is simple, second is a bunch of setup, copying env variables etc.

                There is a good argument for splitting "just run app as different user" and "everything else that has to do with interactive shell and admins doing things on server" but now you have 2 configs to manage...

                • rtpg 2 years ago
                  "ensure authorization" and "raise privileges" and "call exec" are all behind plugin-based architectures to allow for people to set up various ways to do things. The simple example: why do you only need to type in the password once per session/30 minutes calling sudo in most environments? How can people set things up with a hardware key? How do you make just some commands work and not others?

                  That being said I don't think sudo's code is complicated? It's big because it has all of these plugins supporting various mechanisms, but each file is pretty straightforward, and the control flow is really not that hard (after you get that it's plugins).

                  • e12e 2 years ago
                    > All I want it to do is: ensure authorization, raise privileges, call exec.

                    And have an audit log? And clean the environment? In particular the path? Dynamic library path?

                    Still, I suspect "ensure autz" is the problem (implies Pam, 2fa, kerberos, etc etc).

                    • 2 years ago
                      • rob-olmos 2 years ago
                        Probably because of sudoers?
                        • tetris11 2 years ago
                          I also wonder....

                              function sudo { su -c "$@"  root }
                          
                          though I guess half the struggle is enabling sudo without a password
                        • MuffinFlavored 2 years ago
                          I wonder how many other tools we "take for granted" are similar to these these conditions.
                      • zokier 2 years ago
                        > It’s also been ported to Linux

                        Last time I checked there were several different ports floating around. Now I see at least Debian has chosen opendoas, I guess people have mostly converged to that one. Also fun stuff like https://xn--1xa.duncano.de/slicer69-doas.html

                        The point being that while openbsd doas is undoubtedly very nice, the linux ports are separate projects

                        • seanw444 2 years ago
                          Been maining opendoas for a while now. The main problem I have with it is that the "don't require a password for ___ seconds" timeout is unconfigurable as far as I'm aware. So you have to enter your password fairly frequently, which can be annoying on non-sensitive machines.

                          But for simple systems that aren't running complex user privilege management, doas is very much a great replacement.

                          • galangalalgol 2 years ago
                            I don't see any tests on the github. Is there some way to do pipelines for open source projects that wouldn't require funding? Would a free gitlab tier account for stuff like this be within the TOS? I just find it kind of crazy how most of the open source ecosystem has no static analysis or unit tests. I'm not criticizing, I'm trying to figure out how to contribute.
                            • bornfreddy 2 years ago
                              Github does allow (some amount of) GH Actions for free, as does Gitlab.
                            • 7839284023 2 years ago
                              > The main problem I have with it is that the "don't require a password for ___ seconds" timeout is unconfigurable as far as I'm aware.

                              https://wiki.archlinux.org/title/Doas#doas_persist_feature

                              https://wiki.gentoo.org/wiki/Doas

                              With the persist keyword doas can remember an authenticated user and will not require confirmation by password for five minutes.

                            • tetha 2 years ago
                              Indeed, I've been looking around somewhat during off-time with a colleague how much we actually use of sudo, and what doas couldn't do. We're indeed looking at starting a migration, because some DNS based, LDAP integrated, PAM integrated, really complicated priviledge escalator is becoming kinda scary as of late.

                              The biggest difference we found is that sudo is a little more convenient to manage with a config management solution, since each piece of config management code can just drop a file in /etc/sudoers.d. With doas, we have to coordinate a bunch of parts of the config management manipulating one file, /etc/doas.conf. This always turns out a bit messy. But maybe we'll just merge everything into one big and somewhat messy monster doas-conf-template with a ton of feature toggles and loops and go from there.

                              But beyond that, almost all of our sudo rules are 2-3 patterns: Admin can sudo as everyone, zabbix/telegraf can run data gathering commands, and maybe some other automation triggers like pgbackrest wiping a postgres data dir during a restore, that's about it. All of those are pretty trivial doas rules all in all.

                              • yjftsjthsd-h 2 years ago
                                The biggest difference we found is that sudo is a little more convenient to manage with a config management solution, since each piece of config management code can just drop a file in /etc/sudoers.d. With doas, we have to coordinate a bunch of parts of the config management manipulating one file, /etc/doas.conf.

                                Apparently whether it's used is configured at build time, because I get different results trying it on Arch and Alpine, but doas absolutely has a /etc/doas.d

                                EDIT: Oops, apparently Alpine added that - https://git.alpinelinux.org/aports/tree/main/doas/configurat...

                                • tetha 2 years ago
                                  Mh. I'm kinda sad that this is a distro patch. If that was upstream, we'd be using doas at this point in a few sideline setups, I'd guess. Plus, exploiting a directory list or writing files to a rather niche and secure directory generally requires rather high degrees of privilege and usually implies that the system is owned as a whole anyhow.
                                  • TheBrokenRail 2 years ago
                                    > EDIT: Oops, apparently Alpine added that

                                    This seems like a really weird thing for a distro to add themselves rather than upstream.

                                • thayne 2 years ago
                                  It looks like doas is missing some important features sudo has, notably full I/O logging and wildcard and in the newest version regex support for matching arguments. The latter could maybe be worked around with wrapper scripts, but I don't know what you would do for logging. And the password persist option is experimental, and not configurable on Linux.

                                  If you don't need those features, doas is probably a good replacement. But if you do, it probably isn't an option.

                                  • josteink 2 years ago
                                    > It looks like doas is missing some important features sudo has … and wildcard and in the newest version regex support for matching arguments.

                                    Sometimes less is more. My immediate response to that is that it sounds like needless complexity which can be a source of errors, bugs and security-vulnerabilities.

                                    What typical use-cases do these particular features have?

                                    • thayne 2 years ago
                                      > What typical use-cases do these particular features have?

                                      For the io logs: auditing. And in some cases such logs are necessary for compliance reasons.

                                      For wildcards: allowing to run a command, but only if they supply a specific option that makes it less dangerous. Now, you do have to be very careful when doing that, but there are cases where it is useful and explicitly listing every variation of options that is allowed isn't practical.

                                      I also forgot to mention sudoedit. Although, making something similar for doas would be pretty simple, so I'm kind of surprised there isn't something.

                                      • ehutch79 2 years ago
                                        For wildcards;

                                        Allowing a user to use systemctl with specific daemons, so ```systemctl * unit-name```, without a password. But anything outside of that I need a password.

                                    • ilyt 2 years ago
                                      As meme as it is, Rust rewrite wouldn't be out of place...
                                      • wyldfire 2 years ago
                                        > Sudo must be the program with the largest number of buffer overflows I’ve heard about. That news is repeating itself ever since I remember.

                                        That you've heard about. There's two big reasons: (1) people often don't try to spend a lot of time finding exploits for userspace programs that don't open network ports or perform privilege escalation. And (2) when they do find exploits in those programs, they don't make it to HN.

                                        • jmclnx 2 years ago
                                          I was thinking the same, this is the slackbuild for Slackware 15

                                          https://slackbuilds.org/repository/15.0/system/opendoas/?sea...

                                          It also contains some information on how to setup doas on Linux

                                          • vbezhenar 2 years ago
                                            There must not be a single suid program in a safe system. The concept of suid bit is flawed and nothing but a hack. You can build sudo-like functionality using ssh @localhost and additional root user with special shell.
                                            • yakubin 2 years ago
                                              That to me sounds like moving the problem from a privileged binary to a privileged daemon and putting a network stack in the middle. I don’t see how it solves anything. Any way you can secure sshd you can probably apply to the suid binary as well.
                                              • Sohcahtoa82 2 years ago
                                                This requires enabling being able to log in as root, which I'd rather not enable.
                                                • Beltalowda 2 years ago
                                                  And that sshd server is running as root, which is really just the same as setuid except with extra steps.
                                                  • mindwok 2 years ago
                                                    To be honest, your solution sounds far more hacky than a suid bit. A suid bit is effectively just a mechanism to implement privileged access in user space. I don’t see what’s hacky about that.
                                                  • still_grokking 2 years ago
                                                    > Sudo must be the program with the largest number of buffer overflows I’ve heard about. That news is repeating itself ever since I remember.

                                                    libxml? zlib? PHP?

                                                    The déjà vs are many…

                                                    • uri4 2 years ago
                                                      Or just uninstall sudo, at least on opensuse it is optional package.
                                                      • ranger_danger 2 years ago
                                                        • kaba0 2 years ago
                                                          Has absolutely nothing to do with the topic, and frankly, I rather trust a unified program with a set of functionalities done cleanly in a programming language over a set of random bash scripts trying to do the same, but failing. It’s not like you don’t have to communicate between them and it is goddamn bash.. I would make less error in binary.
                                                      • phoe-krk 2 years ago
                                                        A fun one. Buffer overflows tend to usually get associated with providing too much data; here's a nice case in which an overflow is triggered by providing too little. Seems like the buffer for storing the password was changed to be dynamically allocated, but only in some parts of the code; other parts still treated it as something that is at least nine bytes long (including the null terminator).

                                                        In practice, this means that if your password is only one char, then the actual buffer is two bytes long, and the seventh byte past the buffer is then zeroed/set to the null terminator. I wonder if and how this is exploitable.

                                                        • userbinator 2 years ago
                                                          Seems like the buffer for storing the password was changed to be dynamically allocated

                                                          When I see things like this, the first question I have is why? A password isn't going to be long enough to require dynamic allocation, so just use a fixed-size buffer. 255 is already generous and a good round number. The best solutions are often also the simplest.

                                                          • AlexanderDhoore 2 years ago
                                                            This is why I love working in embedded. Our clients would never complain about these kinds of reasonable restrictions. There are tons of limits like this in our machines, which nobody notices but make my life much easier.

                                                            I guess things are different in the Linux/PC software world.

                                                            • tgv 2 years ago
                                                              It also might explain the S in IoT.
                                                            • raldi 2 years ago
                                                              > When I see things like this, the first question I have is why?

                                                              Perhaps because they were still fighting the last war, where they were hurt by a greater-than-255-character buffer overflow vulnerability.

                                                              • insanitybit 2 years ago
                                                                One reason I'd like to write passwords directly to a heap allocated buffer would be so that I can limit where that password exists in memory, ensure it's zero'd appropriately, prevent it being paged to disk, etc.
                                                                • imron 2 years ago
                                                                  > When I see things like this, the first question I have is why?

                                                                  My default assumption is three letter agencies surreptitiously adding back doors.

                                                                  • bell-cot 2 years ago
                                                                    With how many careless programmers there are, writing massive quantities of security-critical code...why would they bother? (Outside of a maybe a few narrow, high-value contexts.) That's like surreptitiously working to make sure that there are plenty of cat pictures on the web, and that water flows downhill.
                                                                    • trashtester 2 years ago
                                                                      As a default assumption, this may be a bit conspiratorial. Inserting something like this into a git repo is relatively easy to track, and a given "contributor" could not do many such things without being caught. Not saying we should ignore the possibility, though...

                                                                      But there are plenty of ways for such agencies to gain similar access, including any kind of closed code in BIOSes, drivers, firmware etc. Or by taking control of select infra, and injecting MITM features there (that would remain stealthy, and only activate for very select targets.)

                                                                      • generalizations 2 years ago
                                                                        This should be a reasonable position to take. There's means and motivation present. The threat model should be taken seriously.
                                                                      • marcosdumay 2 years ago
                                                                        Because then you'll have another vulnerability created by too long passwords.
                                                                        • GTP 2 years ago
                                                                          Not necessarily, as you can put a limit on how many characters you read from the shell. But you're right that you can screw up in both cases, I would just say that if you have a fixed length for the buffer it is a bit easier to handle it correctly.
                                                                      • _notreallyme_ 2 years ago
                                                                        This might be exploitable in some cases. There has been a "heated" discussion in 2014 about off-by-one NUL byte heap overflow that lead to this blogpost from projectzero:

                                                                        https://googleprojectzero.blogspot.com/2014/08/the-poisoned-...

                                                                        There have been other examples where only a 1 could be written.

                                                                        • st_goliath 2 years ago
                                                                          > the seventh byte past the buffer is then zeroed/set to the null terminator. I wonder if and how this is exploitable.

                                                                          Well, looking at the upstream code, the original value is saved away before zeroing it out and then unconditionally restored after running crypt.

                                                                          If sudo is single threaded and crypt() doesn't malloc() anything, I don't think that can be exploited. Worst case would be a segfault if the password was somehow close enough to a page boundary.

                                                                          • geocar 2 years ago
                                                                            > I don't think that can be exploited.

                                                                            glibc malloc() should be aligned to 2*sizeof(size_t), so strup("")[x] on 64-bit systems (with 16-byte alignment) can never crash or overlap another object where x<16

                                                                            On 32-bit systems and with other mallocs you could potentially be reaching another page (like I think you are imagining) or trashing some bookkeeping bits which might crash free() but I cannot yet see how you would induce that, nor convince myself it cannot be done without spending more time thinking about it (something I'm reluctant to do with my afternoon)

                                                                          • dottedmag 2 years ago
                                                                            Probably only with severely niche libc. Is there any libc that allocates data with granularity smaller than 16 bytes?
                                                                            • nn3 2 years ago
                                                                              Very doubtful there is one. Seems like a total nothing burger
                                                                              • tinus_hn 2 years ago
                                                                                Sudo is a security boundary, it has to be rock solid and an issue that doesn’t immediately look exploitable is still a big deal. Sudo runs under the control of the attacker, it’s playing with fire!
                                                                            • _kbh_ 2 years ago
                                                                              > I wonder if and how this is exploitable.

                                                                              Would be at worst a memory read past the inputted password, which wouldn't be super useful outside of a leak for another vulnerability but even that seems unlikely.

                                                                              • TonyTrapp 2 years ago
                                                                                No, the code overwrote the 9th byte of the buffer to add a null terminator: https://github.com/sudo-project/sudo/commit/bd209b9f16fcd127...

                                                                                So it's not just reading past the end of the buffer, but it's overwriting a single byte potentially belonging to another object. It may still cause a crash but it's relatively unlikely that it could cause something more severe.

                                                                                • _kbh_ 2 years ago
                                                                                  > No, the code overwrote the 9th byte of the buffer to add a null terminator: https://github.com/sudo-project/sudo/commit/bd209b9f16fcd127...

                                                                                  Ah that makes a lot more sense.

                                                                                  > So it's not just reading past the end of the buffer, but it's overwriting a single byte potentially belonging to another object. It may still cause a crash but it's relatively unlikely that it could cause something more severe.

                                                                                  Yeah I agree that nothing severe should come from it. The allocations are probably larger then the size of the buffer being used so it may not even right off the end of its own allocation.

                                                                                  • Someone 2 years ago
                                                                                    I don’t understand how this can be correct:

                                                                                        if (pw_len == DESLEN || HAS_AGEINFO(pw_epasswd, pw_len)) {
                                                                                     strlcpy(des_pass, pass, sizeof(des_pass));
                                                                                     pass = des_pass;
                                                                                        }
                                                                                    
                                                                                    Doesn’t that truncate your password if it happens to have DESLEN characters?
                                                                                • AtNightWeCode 2 years ago
                                                                                  It is a very known exploit. Easily found with the stupid fuzz tests but even easier found with tests that tests all edge cases. You have to have a set of complete amateurs of coders to end up with this problem in production.
                                                                                  • AtNightWeCode 2 years ago
                                                                                    It is funny what you get downvoted for in this garbage forum. 15 years ago we built stuff in C and used cheap commercial available tools that detects EXACTLY this issue. There is no excuse to end up with this in prod 2022. Amateurs.
                                                                                    • pjmlp 2 years ago
                                                                                      15 years? Lint was created in 1979 exactly to track down common errors in C, and until clang static analysis it was largely ignored.

                                                                                      No wonder that these kind of tooling keeps being ignored until we get liability in software products.

                                                                                • singron 2 years ago
                                                                                  It looks like this only affects DES passwords. Glibc has supported other hashing algorithms for a very long time and most Linux distros have used them by default for years. I don't think there is a way for an unprivileged user to choose DES if it's not the default, so it's very unlikely this can actually be triggered.
                                                                                  • gunapologist99 2 years ago
                                                                                    Very good point. And, overriding defaults would mean that you have sufficient knowledge to know what not to choose. So, the practical impact of this is virtually nil.
                                                                                  • erk__ 2 years ago
                                                                                    • hardware2win 2 years ago
                                                                                      Another day, another CVE in tool that we rely on everyday

                                                                                      The first question that we all want to ask

                                                                                      Could it be mitigated by safer, modern tech?

                                                                                      • jerf 2 years ago
                                                                                        Yes.

                                                                                        One does not even need to reach for Rust. Literally any other language (in common use) other than very badly used C++ would not have had this problem.

                                                                                        C delenda est.

                                                                                        • nequo 2 years ago
                                                                                          What is the reason that safety-critical tools like sudo and OpenSSL are not written in Ada? Rust is still undergoing a lot of work but Ada has been around, has been stable, and it is fast.

                                                                                          Is it that GNAT only became available relatively late in the lifetime of GNU/Linux? Or is there another technical reason for it?

                                                                                          • pjmlp 2 years ago
                                                                                            UNIX and C are symbiotic, for a long time, C would be the only compiler in the box, eventually C++ joined the party as they share the same origin.

                                                                                            Anything else required buying the product and justify why the compilers in the box wouldn't do it .

                                                                                            When UNIX SDKs became commercial, it was even worse, you would naturally one buy the main one, not pay twice for programming languages.

                                                                                            Then the UNIX clones also followed the same culture focusing on C for the clones. Early versions of the GNU manifesto explicitly refer that C should be the preferred language.

                                                                                            That is how we landed here.

                                                                                          • thr0wnawaytod4y 2 years ago
                                                                                            but if sudo was written in java we'd have other problems ;)
                                                                                            • jerf 2 years ago
                                                                                              Yes, I agree. I did not mean to imply that literally any other language would have been better for sudo, which I see is a viable reading of my original post. Go, for instance, would be a terrible choice, because the way the runtime deeply assumes you're running in a multithread environment, even before it gets to your "main" function, means that exactly the sort of UNIX hackery sudo is designed to do is effectively impossible. I have a system myself that is otherwise entirely in Go, but we have a very small C-based wrapper whose job it is to be setuid, open a few files with the escalated privileges, do some user verification, then change its uid and gid and exec the "real" Go program, because Go just can't do those things.

                                                                                              Dynamically typed languages as a whole would be a bad idea.

                                                                                              Java's startup time for such a small executable would be a problem.

                                                                                              I'm just saying this problem is unique to C, and in my opinion, sufficiently endemic to security software to disqualify it entirely.

                                                                                              Mind you, you might well end up at Rust in the end anyhow. Perhaps D. It isn't necessarily a long list for a sudo replacement. But...

                                                                                              C delenda est.

                                                                                              • pjmlp 2 years ago
                                                                                                Do you know one of the reasons why Multics had a better security score than UNIX on DoD assement?

                                                                                                PL/I does bounds checking by default.

                                                                                                • 2 years ago
                                                                                                  • kaba0 2 years ago
                                                                                                    Like what? It would be written once correctly and work as is intended pretty much forever.
                                                                                                  • Barrin92 2 years ago
                                                                                                    I don't understand why redhat in particular still is so obsessed with C. I saw that Flatpak was written in C looking at the repo recently and for such a security relevant, relatively young project I don't know why people still stick to non-GC languages.
                                                                                                    • kirbyfan64sos 2 years ago
                                                                                                      Rust came out in 2015, a year after the first release of Flatpak (back when it was still called xdg-app) in 2014. The ecosystem was also much smaller; some very necessary things for working nicely on Linux that exist now like zbus (the prominent async-compatible D-Bus library) wouldn't be a thing for several more years.

                                                                                                      RH does have an interest in Rust, used in projects such as Stratis. It's just that the Linux dev ecosystem has been very C-reliant for a long time, and a massive amount of binding and other ecosystem work is still happening to make this possible.

                                                                                                      *EDIT:* and the reason I mention Rust specifically is that, in these types of lower-level projects, a lot of things can start to get hairy very quickly in higher level languages. Things like some namespace APIs very much wanting to be run on a single thread, or trying to maintain performance when you're intercepting and examining every D-Bus message, or even just when you want your functionality to be in a reusable core library.

                                                                                                      • jeroenhd 2 years ago
                                                                                                        I understand why they stick to non-GC languages (performance, startup time, the need for maintained wrappers for native calls, etc.), but I don't understand why they don't pick better ones. Rust is nice and shiny but even modern C++ with some good conventions would be miles ahead of plain old C.

                                                                                                        Languages like D even allow you to disable the garbage collector for specific methods, giving you the benefit of GC-less performance and characteristics in critical code paths and the YOLO memory management of GC languages in the wrappers around them.

                                                                                                        I guess the answer is "because all the people over at Redhat know C"

                                                                                                        • dottedmag 2 years ago
                                                                                                          You meant unsafe, not non-GC?
                                                                                                      • cbrogrammer 2 years ago
                                                                                                        We could start by considering not writing stuff like

                                                                                                        > /*

                                                                                                        > * Truncate to 8 chars if standard DES since not all crypt()'s do this.

                                                                                                        > * If this turns out not to be safe we will have to use OS #ifdef's (sigh).

                                                                                                        > */

                                                                                                        > sav = pass[8];

                                                                                                        • userbinator 2 years ago
                                                                                                          The solution is simplicity, not more complexity.

                                                                                                          This bug was introduced by the latter.

                                                                                                          If you seriously think a buffer for a password needs to be dynamically allocated, the "safest" and most "modern" shit won't help. It'll just contribute to the ongoing decline.

                                                                                                          • insanitybit 2 years ago
                                                                                                            > the "safest" and most "modern" shit won't help

                                                                                                            But it would

                                                                                                            • ehutch79 2 years ago
                                                                                                              I'm pretty sure their point was that there are fundamental issues at play, and that switching languages does not make the problem go away.

                                                                                                              Rust/whatever is not a magic bullet

                                                                                                          • pjmlp 2 years ago
                                                                                                            > ..array-out-of-bounds error that can result in a heap-based buffer over-read...

                                                                                                            This was already a solved problem in NEWP, JOVIAL and PL/I, no need for modern tech, only not to insist in using broken by design one.

                                                                                                            • st_goliath 2 years ago
                                                                                                              > Could it be mitigated by safer, modern tech?

                                                                                                              Like... Coverity Scan?

                                                                                                              In my experience, this bug looks like a classic example for something that Coverity should find.

                                                                                                              And it looks like sudo is already on there: https://scan.coverity.com/projects/sudo

                                                                                                              The last analysis was 2 weeks ago. I wonder if this CVE is among the outstanding memory corruption and illegal access defects (5 each).

                                                                                                              • candiddevmike 2 years ago
                                                                                                                Related, but sudo is not in scope for this project:

                                                                                                                https://github.com/uutils/coreutils

                                                                                                                • Iolaum 2 years ago
                                                                                                                  And the second question, would be: What is the cost for it and would we be willing to pay it?
                                                                                                                  • phoe-krk 2 years ago
                                                                                                                    And the third question, would be: What is the cost for using outdated technology and are we really willing to pay it?
                                                                                                                    • j-krieger 2 years ago
                                                                                                                      The answer to the first question is „literal billions in damages“ and the answer to the second one is „seemingly yes“. Library / application maintainers and product companies rarely pay the cost if yet another memory safety issue leads to a new 0day.

                                                                                                                      Perhaps changing that would finally turn people off of C/C++

                                                                                                                      • eru 2 years ago
                                                                                                                        Well, in practice we are paying it.
                                                                                                                      • hardware2win 2 years ago
                                                                                                                        You are talking about perf?

                                                                                                                        People use fucking java in HFT

                                                                                                                        dont worry, our basic tools are fine with Rust, go or even c#

                                                                                                                        • MobiusHorizons 2 years ago
                                                                                                                          For cli tools startup performance matters a lot, and many languages struggle on that point (eg Java) go and rust would probably be acceptable though.
                                                                                                                      • chlorion 2 years ago
                                                                                                                        Bounds checking would have prevented this outright.

                                                                                                                        Bounds checking has been standard in every language other than C since 1970, but for some reason C programmers refuse to use it, normally using arguments like "just make sure the indexes are correct", which is basically "just don't write bugs".

                                                                                                                        • pjmlp 2 years ago
                                                                                                                          Bounds checking in systems languages precedes C for a decade, making it worse their decision to ignore it.
                                                                                                                        • Beltalowda 2 years ago
                                                                                                                          sudo is almost 150k lines of code, has been developed since about 1980, and works (and is used!) on a wide array of systems.

                                                                                                                          Are you going to rewrite all of that in $other_language_than_c? How many hours of work do you think this will take to rewrite?

                                                                                                                          This is the real issue.

                                                                                                                          • TheBrokenRail 2 years ago
                                                                                                                            > sudo is almost 150k lines of code

                                                                                                                            I'd argue that's (at least part of) the problem. More code = more surface area for bugs, and sudo has a lot of code.

                                                                                                                            • Beltalowda 2 years ago
                                                                                                                              It is, but that code wasn't added for the craic and does solve real use-cases that you can't just ignore for a full-featured drop-in s/sudo/.../-type replacement.

                                                                                                                              (also, 150k lines of code is a little bit misleading, since not all code is for all platforms, sudo has a plugin architecture I believe, etc.)

                                                                                                                            • j-krieger 2 years ago
                                                                                                                              Translating that one to one would take 10 developers at 100loc / day less than half a year.

                                                                                                                              Surely that can‘t be that much in the name of security, no?

                                                                                                                              • Beltalowda 2 years ago
                                                                                                                                I think that is a very optimistic estimate considering it's pretty difficult security-sensitive code which integrates with quite a number of system components in complex ways across a large number of different platforms (this particular bug was introduced for HP-UX compatibility for example).

                                                                                                                                But you're welcome to try of course. But if it was that easy I bet someone would have done so already. This is the classic "zomg look at how complex it is, let's just rewrite it from scratch!" and then you discover that the complexity is there because it solves a long list of edge cases.

                                                                                                                                > Surely that can‘t be that much in the name of security, no?

                                                                                                                                Meh; in reality, almost no one was affected by this particular bug, and even if they were, you needed system/shell access to be affected. Like many sudo security problems in reality they're often actually not that big of a deal. Of course, it could be improved, but there's a long list of other things that are more impactful.

                                                                                                                            • postalrat 2 years ago
                                                                                                                              Eventually it will be written in javascript.
                                                                                                                            • stabbles 2 years ago
                                                                                                                              sudo feels like a broken concept to me in general.

                                                                                                                              sudo make install, ok, great, some of the many operations you need to do requires privileges? Better give elevated privileges to all operations!

                                                                                                                              Even worse with GUI: enter your password to install. Now I have absolutely no clue what the scope of sudo is.

                                                                                                                              Of course I don't want to enter my password for all individual cp and mv operations, but if sudo had a better/smaller scope that'd be great.

                                                                                                                              • fhars 2 years ago
                                                                                                                                The real broken concept here is root. Why do I have to give a process the ability to do anything it wants with the system if I want it just to write to a file in /etc, or to bind to port 80?

                                                                                                                                On the other hand, having to always explicitly specify all the fine grained capabilities a process might need is a pain, too.

                                                                                                                                • jeroenhd 2 years ago
                                                                                                                                  Port 80 doesn't need root access. Have an administrator `setcap cap_net_bind_service=+ep /your/binary/here` and you can use any port you want.

                                                                                                                                  Files within /etc do, for security reasons, but there's no reason why you couldn't use user groups or other ACLs to secure those folders.

                                                                                                                                  chown /etc to nobody:wheel and chmod it to g+rwx; users in group wheel will now be able to manage /etc. You've got to make sure you set your umask right if you do use sudo for /etc again, but that's also just part of your system configuration.

                                                                                                                                  • iam-TJ 2 years ago
                                                                                                                                    Changing ownership of /etc/ and directories under it like that sounds fine in theory but in practice breaks in many ways.

                                                                                                                                    I did some extensive testing of this some years ago (on Debian/Ubuntu) and many system services and tools expect/require these directories to have specific ownership and permissions.

                                                                                                                                    In the context I was experimenting with it was pretty simple too - renaming the UID 0 'root' account to some other name. That revealed that many tools actually test for "root" (the string) not uid == 0.

                                                                                                                                    As I dug into the code of those tools I found many would also check and insist on particular ownership and modes on the directories and files.

                                                                                                                                    I forget which one really annoyed me, but 'all' I wanted to do was allow members of group 'adm' to read/write into a particular sub-directory of /etc/ but the service would bail out if the directory wasn't owned by "root":"root" (or 0:0) and had 0700 permissions which is a pain when wanting to run services unprivileged and using 'setcap' to enable capabilities without starting as UID 0 and dropping privileges.

                                                                                                                                    • BeefWellington 2 years ago
                                                                                                                                      An alternate approach is to set the sysctl for this:

                                                                                                                                          net.ipv4.ip_unprivileged_port_start=80
                                                                                                                                      
                                                                                                                                      Or whatever port you want unprivileged to start at. If you set it to 0 it means any user can bind to any port < 1024.

                                                                                                                                      Ref: https://www.kernel.org/doc/htmldd/latest/networking/ip-sysct...

                                                                                                                                      • Calzifer 2 years ago
                                                                                                                                        > Have an administrator `setcap cap_net_bind_service=+ep /your/binary/here` and you can use any port you want.

                                                                                                                                        And remember to do it again every time the binary is updated :/

                                                                                                                                        > chown /etc to nobody:wheel and

                                                                                                                                        Bad idea! nobody is supposed to own no files at all. You run untrusted services (or untrusted users without account; something like anonymous FTP access) as nobody. This would potentially allow the least trusted entity to change your configs.

                                                                                                                                        Apart from that. Since root can read any file anyways there is no reason to change the owner. And some programs may complain if the configuration is not owned by root.

                                                                                                                                        • fhars 2 years ago
                                                                                                                                          Yes, having to always explicitly specify all the fine grained capabilities a process might need is a pain, too.
                                                                                                                                          • robertlagrant 2 years ago
                                                                                                                                            Having a process request its required capabilities and sudo displaying that list to the user, who can agree to sudo giving giving them only those capabilities would be good.
                                                                                                                                          • Beltalowda 2 years ago
                                                                                                                                            Being able to write to /etc/ is effectively just granting full access, since there's lots of things in there that can run code.

                                                                                                                                            Doing fine-grained access is really hard; even without "root" you still have things like, say, "archive_command" in postgresql.conf which will allow running people to run arbitrary commands as the postgres user, and is that really what you want? There's lots of little things like that ranging from application configurations to crontabs to your init system.

                                                                                                                                            • icare_1er 2 years ago
                                                                                                                                              Go ahead, send your commits to the Linux kernel then.
                                                                                                                                            • ccouzens 2 years ago
                                                                                                                                              Sudo feels like a broken concept to me because it's there to protect the machine and other users.

                                                                                                                                              But these days many computers are only used by one user.

                                                                                                                                              Everything I care about on my computer is readable by my user and a program running as my user could put fake binaries in my path.

                                                                                                                                              • hjanssen 2 years ago
                                                                                                                                                This is why the concept of "granular permissions" is so important on modern pcs, and I personally think linux is severely lacking in this regard.

                                                                                                                                                Flatpack et al. have improved this situation somewhat, but come with their own drawbacks. Linux needs a central application-level permission system like Android, where I can grant/revoke e.g. internet access to applications. Frankly, I should never have to use sudo to install anything in my daily life, that is unfortunately not the case with the common ubuntu install, and will probably stay this way for a long time.

                                                                                                                                                • docandrew 2 years ago
                                                                                                                                                  Yeah, for the most part today any user who is logged in is somebody I trust with the machine. What needs to be restricted is what _applications_ can do.

                                                                                                                                                  My browser shouldn’t ever be allowed to to write to /etc/shadow regardless of whether it’s running as root or not. AppArmor gets us part of the way there but the UI to make everything play nice is too difficult.

                                                                                                                                                  Android’s security model makes a lot of sense to me, and from what I understand it’s all based on top of normal UNIX user/group privileges, just with per-app users/groups. I’d like to see more desktop distros experiment with it.

                                                                                                                                                • candiddevmike 2 years ago
                                                                                                                                                  For desktop use, sudo let's you elevate your permissions as necessary (polkit kinda replaces some sudo stuff, but similar concept). The reason you want this is when you run anything, it will _by default_ run as your unprivileged user, not root. That is a huge security benefit and pretty standard across desktop OS these days.

                                                                                                                                                  Now on a server, sudo for a single user probably doesn't make sense, just use root and keep it simple.

                                                                                                                                                  • portabelllaa 2 years ago
                                                                                                                                                    > That is a huge security benefit and pretty standard across desktop OS these days.

                                                                                                                                                    But is it really though? That's the parent was alluding to.

                                                                                                                                                    I have the same feelings - all my important data are readable/writeable as my user, if I somehow manages to run a malicious program as my normal user it's game over as far as I'm concerned, having root would cause no extra damage.

                                                                                                                                                    • ehutch79 2 years ago
                                                                                                                                                      Are you suggesting running everything as root?

                                                                                                                                                      As in when you setup a new vm or whatnot, that you shouldn't create a user account to run thing as?

                                                                                                                                                      Does this include things like nginx not dropping privileges to run as a user?

                                                                                                                                                    • tbrownaw 2 years ago
                                                                                                                                                      A - I have access to quite a few *nix servers, where multiple login users and/or services with district UIDs are a thing.

                                                                                                                                                      B - Not sure how practical most of this is yet, but there's cool stuff around isolating individual programs even on single-user machines.

                                                                                                                                                      C - My desktop has a couple things that listen on the network, and it's nice that they only have access to specific things.

                                                                                                                                                      • ilyt 2 years ago
                                                                                                                                                        Well, kinda. For user, sure, but we could definitely get some security from having more granular permission for apps that the user runs (without going into extremes like Qubes OS).

                                                                                                                                                        For example, sound demon like pulseaudio runs as your user (...for some reason, fucking Lennart) but it really should not have write access to anything aside from its own config and for 99,99% users also not have access to read anything your user owns aside from its own config.

                                                                                                                                                        Even browsers should probably be limited, or user should at least get prompt, there is little reason to allow browser to dig around your system willy nilly, let alone in locations like ~/.ssh

                                                                                                                                                        • ccouzens 2 years ago
                                                                                                                                                          To be fair, it's the permission model that's not kept up with use cases. On a multiuser system sudo makes a lot of sense.
                                                                                                                                                          • twobitshifter 2 years ago
                                                                                                                                                            I feel that most computers may be used by 1 user but belong to someone else with their own requirements as to what is permissible. Company laptops seem to be more common than personal machines. Most will just have iPads and phones For personal use.
                                                                                                                                                          • pid-1 2 years ago
                                                                                                                                                            You can sudo to other users besides root.

                                                                                                                                                            For installing things, you generally need write permissions to /usr/bin and likes. So you could create an user with such privileges and sudo to that.

                                                                                                                                                            The real issue, I think, is Linux not being capability based, so there's no programmatic way for scripts to communicate which sort of permissions are needed.

                                                                                                                                                            • user3939382 2 years ago
                                                                                                                                                              > communicate which sort of permissions are needed

                                                                                                                                                              OpenBSD has something like this https://man.openbsd.org/pledge.2

                                                                                                                                                              • unsafecast 2 years ago
                                                                                                                                                                Unfortunately not. Pledge is _awesome_, but it's a different thing.

                                                                                                                                                                Pledge protects the system from buggy well-intentioned, cooperative software that could have bugs. What's needed is something that protects the system from ill-intentioned, uncooperative software.

                                                                                                                                                              • BeefWellington 2 years ago
                                                                                                                                                                SELinux was intended to address this very thing. It's a complex beast that people find too difficult to understand and thus usually it gets disabled.

                                                                                                                                                                I see this attitude in pentesting too on embedded systems. A developer encounters a problem they don't quite understand but the problem disappears when they run their app as root, so away we go.

                                                                                                                                                              • ilyt 2 years ago
                                                                                                                                                                You can just allow those smaller scope commands and nothing else in sudo.

                                                                                                                                                                That's a part of a reason for its complexity it does allow you to do anything between "make user be another user with all priviledges" to "just allow to run this particular command and nothing more".

                                                                                                                                                                Having one that had option for more limits would be interesting (say use cgroups to change running user but disallow command from modifying anything aside from this one single directory you specified) but, well, that's way more code that also needs to be secure...

                                                                                                                                                                • TheBrokenRail 2 years ago
                                                                                                                                                                  > sudo make install

                                                                                                                                                                  Even ignoring security issues, all of make getting elevated privileges can cause other issues as well.

                                                                                                                                                                  All it takes is the incremental build system being a little finicky, and "sudo make install" could rebuild an object as root, and now one or more of your ".o" files are owned by root and your build directory is broken.

                                                                                                                                                                  • im3w1l 2 years ago
                                                                                                                                                                    Sudo has two protective jobs. One is to completely prevent people from elevating if they aren't in sudoers. The second is a best-effort attempt at preventing people from blowing their own foot off, by running most commands without privileges.

                                                                                                                                                                    If you are in sudoers and you are compromised, then there are like a million ways of getting root for a malicious program. They could override your sudo, override your terminal, override your shell, override your de, even override say "cat" so that instead of exiting when it is done, it starts a shell that mitms all your commands and waits for a sudo one.

                                                                                                                                                                    • cryptonector 2 years ago
                                                                                                                                                                      set-uid is especially dangerous, so that's the best target for removal.
                                                                                                                                                                    • alibob 2 years ago
                                                                                                                                                                      Why is "sudo 1.8.0 through 1.9.12" affected, but rhel8 shipping sudo 1.8.29 and rhel9 shipping sudo 1.9.5, are not affected?

                                                                                                                                                                      <https://access.redhat.com/security/cve/CVE-2022-43995>

                                                                                                                                                                        Description:
                                                                                                                                                                        ... Sudo 1.8.0 through 1.9.12 ...
                                                                                                                                                                        Statement:
                                                                                                                                                                        The sudo package as distributed with Red Hat Enterprise Linux 7, 8 and 9 is not affected by this issue as it currently doesn't ship the affected code.
                                                                                                                                                                      
                                                                                                                                                                      <https://access.redhat.com/downloads/content/sudo/x86_64/pack...>

                                                                                                                                                                        1.9.5p2-7.el9
                                                                                                                                                                        1.8.29-8.el8
                                                                                                                                                                      • alibob 2 years ago
                                                                                                                                                                        <https://news.ycombinator.com/item?id=33467522>

                                                                                                                                                                        Got it. Linux distributions (ex. RHEL) have --with-pam in configure, so not vulnerable (code not compiled). (If you have --with-passwd in configure, then passwd.c is compiled, and you are vulnerable, but Linux distributions do not do this.)

                                                                                                                                                                        <https://ubuntu.com/security/CVE-2022-43995>

                                                                                                                                                                          sudo packages in Ubuntu are compiled with PAM support, so the vulnerable code isn't part of the binaries.
                                                                                                                                                                          Not vulnerable (code not compiled)
                                                                                                                                                                      • pdimitar 2 years ago
                                                                                                                                                                        Alright, this is getting tiring.

                                                                                                                                                                        Zig, Nim, Rust, D, V, whatever -- can't we just move on from C/C++ already? It's obvious they are not up for the job.

                                                                                                                                                                        • nequo 2 years ago
                                                                                                                                                                          I do wonder if a dependently typed language like Agda or Idris would be a better choice for something like sudo. They are not terribly slow (to run), by today they are well-understood, and they can formally prove invariants about the program.
                                                                                                                                                                          • pdimitar 2 years ago
                                                                                                                                                                            Could be. Having both strong static typing (and a more formal one) and less code will help a lot.
                                                                                                                                                                          • tmtvl 2 years ago
                                                                                                                                                                            C and C++ are far from the same thing. That said, D does seem kinda nice so I wouldn't mind seeing some rewrites of critical infrastructure in it. Preferably something that'll benefit more from the rewrite than ls would.
                                                                                                                                                                            • pdimitar 2 years ago
                                                                                                                                                                              Sure C++ is a tad better than C but compared to e.g. Rust and Zig it's pretty convoluted and verbose when trying to achieve things that they achieve with 2-5 liners.

                                                                                                                                                                              And even if modern C++ is amazing -- I have no doubt it's improving all the time -- that doesn't change the fact that there are metric tons of C++ code out there that nobody will ever modernize. So C++ getting improved with time is sadly an almost moot point.

                                                                                                                                                                              I'd personally advocate for Rust but I've heard people say there are a few other languages that allow you to achieve the same memory safety so, by all means, let's please start rewriting and make our everyday tools something different than a Swiss cheese of potential and actual security threats. It really is time.

                                                                                                                                                                              The language doesn't matter, the outcomes do. And in terms of outcomes I maintain that C and C++ have not stood the test of time in terms of security and amount of foot guns. Too much sentimental value is attached to them as well and that doesn't help matters either.

                                                                                                                                                                              We work with tech. We don't make love with it. We should all start acting like this is a job and not [only] a hobby.

                                                                                                                                                                              • pjmlp 2 years ago
                                                                                                                                                                                > Sure C++ is a tad better than C but compared to e.g. Rust and Zig it's pretty convoluted and verbose when trying to achieve things that they achieve with 2-5 liners.

                                                                                                                                                                                yeah, if one is stuck in C++98 mentality.

                                                                                                                                                                          • teddyh 2 years ago
                                                                                                                                                                            • millert 2 years ago
                                                                                                                                                                              As far as I can tell this is a non-issue. A single byte is written potentially outside a dynamically allocated buffer but the original contents is restored before the function returns (sudo is single-threaded). At best it could be a crash, but even that is unlikely unless using address sanitizer or valgrind.
                                                                                                                                                                              • Flocular 2 years ago
                                                                                                                                                                                Come on :D CVSS of 7.1, Complexity Low, Availability and Confidentiality High. sure...
                                                                                                                                                                                • BeefWellington 2 years ago
                                                                                                                                                                                  What do you think is an appropriate score? Looks reasonable to me.
                                                                                                                                                                                  • Flocular 2 years ago
                                                                                                                                                                                    Attack complexity High (chance for an attacker to get anything at all is very low), Availability None (you're not crashing any service that's running in the background) and Confidentiality Low (data leaked is not in the attackers control and not likely to be interesting). Adds up to a score of 2.9
                                                                                                                                                                                    • BeefWellington 2 years ago
                                                                                                                                                                                      IF you can execute code this way (which is an IF) then it's way more severe than a 2.9, and you could absolutely do anything you want with the system (you'll be root).

                                                                                                                                                                                      Complexity High isn't about what an attacker gets, it's about whether or not any specific configuration must exist for the attack to happen. For instance, if an app that talks to several services over different file transfer protocols has a vulnerability in only the FTP component, and these are not under attacker control, that's Complexity High.

                                                                                                                                                                                • TheBrokenRail 2 years ago
                                                                                                                                                                                  Seriously, why is sudo so complicated? Most of the time, all sudo has to do is hash a password, check that hash against a file, and if successful, run a program as root.

                                                                                                                                                                                  Why can't we just have a minimal version of sudo that does just that and only that so the majority of smaller servers and home users can run sudo without fear of a security bug ever other month? Preferably using the same executable path so that everything else doesn't break.

                                                                                                                                                                                  It just seems like most of sudo's security bugs come from weird obscure features almost no one uses. Like that time sudoedit had a security issue. I didn't even know that command existed until it broke things, and it still seems pointless when you can just run "sudo nano" or "sudo vi".

                                                                                                                                                                                  • sersnth 2 years ago
                                                                                                                                                                                    sudoedit runs the editor as the original non-privileged user, which is nice if you're using a configurable text editor like vim/emacs so you're not suddenly using whatever (lack of) configuration the root user has setup. It can also be nice to know any other stuff a complex editor can do like running other programs won't happen in the privileged context.
                                                                                                                                                                                    • maxnoe 2 years ago
                                                                                                                                                                                    • effie 2 years ago
                                                                                                                                                                                      This sort of fail isn't new to sudo, migrate to doas if you can - a much simpler(immensely) and less error-prone program.
                                                                                                                                                                                      • v3ss0n 2 years ago
                                                                                                                                                                                        Time to write sudo alternative in rust
                                                                                                                                                                                        • stoplying1 2 years ago
                                                                                                                                                                                          `please` in fact does exist. NixOS even has a module for it. ;)

                                                                                                                                                                                          https://github.com/edneville/please

                                                                                                                                                                                        • ho_schi 2 years ago
                                                                                                                                                                                          Please stop calling for a rewrite with the next language which is currently in trend. Use the right tool which fits your purpose. An example to learn: https://news.ycombinator.com/item?id=31089216

                                                                                                                                                                                          Lessons:

                                                                                                                                                                                              * Serious bugs doesn't care in which language the error happens
                                                                                                                                                                                              * C++ implementation was safe
                                                                                                                                                                                              * Java implementation was unsafe
                                                                                                                                                                                              * Test-Coverage would help...
                                                                                                                                                                                          
                                                                                                                                                                                          PS: I don't say Rust is good/bad. C++ is good/bad. Or is good/bad. Neither about Java.
                                                                                                                                                                                          • chlorion 2 years ago
                                                                                                                                                                                            >Serious bugs doesn't care in which language the error happens

                                                                                                                                                                                            This just isn't true.

                                                                                                                                                                                            Buffer overflows are not possible with bounds checking.

                                                                                                                                                                                            Using a language that provides containers with bounds checked access methods would have prevented this. This isn't a point of debate or something, it's a fact.

                                                                                                                                                                                            C is virtually the only language that doesn't provide a safe way to access elements.

                                                                                                                                                                                            C++ provides bounds checking with std::array, std::vector and std::string using the "at()" methods. All Rust containers are checked by default. Pretty much every other language also is checked by default as well. All of these language's could have prevented this error and the other buffer overflow errors which there are tons of.

                                                                                                                                                                                            • eklitzke 2 years ago
                                                                                                                                                                                              Sure but you wouldn't be reading a password into a std::array or std::vector in C++, you'd be reading into a std::string or possibly something like a std::stringstream. And both of those containers will handle sizing and reallocation for you.

                                                                                                                                                                                              If your point is that C++ lets you do unsafe things then yes, of course it does. But so does Rust.

                                                                                                                                                                                            • ilyt 2 years ago
                                                                                                                                                                                              sudo has long history of bugs that would be impossible in Rust in the first place.

                                                                                                                                                                                              Yes, given enough care and effort you might write code that will not have those bugs, but not having a possibility (aside from unsafe{}) to have them in the first place is usually better approach.

                                                                                                                                                                                              Like, yeah, it is a dumb meme but in this case not without merit.

                                                                                                                                                                                          • zitterbewegung 2 years ago
                                                                                                                                                                                            Overflow should be named hunter2 or sudoer2
                                                                                                                                                                                            • mrtweetyhack 2 years ago