Most active commenters
  • nullindividual(6)
  • aidenn0(5)
  • anthk(4)
  • Aardwolf(3)
  • CarpaDorada(3)
  • 0xC0ncord(3)
  • noirscape(3)
  • pjc50(3)
  • stevekemp(3)

Against /Tmp

(dotat.at)
134 points todsacerdoti | 101 comments | | HN request time: 1.932s | source | bottom
1. Aardwolf ◴[] No.41913873[source]
I like /tmp in RAM myself, it's truly temporary that way

EDIT: I do this more for avoiding certain disk reads/writes than security actually

replies(5): >>41913905 #>>41913910 #>>41913918 #>>41914627 #>>41916103 #
2. CarpaDorada ◴[] No.41913885[source]
Is it possible to configure every user to see /tmp as $USER/.tmp via some Linux isolation method (namespaces)?
replies(2): >>41913908 #>>41913926 #
3. jauntywundrkind ◴[] No.41913895[source]
Oh man, this sort of thing is part of what I love love love about systemd. It bakes in so many great isolation/sandboxing/privacy measures for units! From the article:

> There should be per-user temporary directories. In fact, on modern systems there are per-user temporary directories! But this solution came several decades too late.

> If you have per-user $TMPDIR then temporary filenames can safely be created using the simple mechanisms described in the mktemp(1) rationale or used by the old deprecated C functions. There’s no need to defend against an attacker who doesn’t have sufficient access to mount an attack! There’s no need for sticky directories because there aren’t any world-writable directories.

May I introduce you to PrivateTMP= ?

> PrivateTmp=¶

> Takes a boolean argument. If true, sets up a new file system namespace for the executed processes and mounts private /tmp/ and /var/tmp/ directories inside it that are not shared by processes outside of the namespace

https://www.freedesktop.org/software/systemd/man/latest/syst...

Notably you don't even need to change how programs work (no $TMPDIR necessary)! It creates a filesystem namespace for your process, such-that you see the normal fs, but with your own /tmp ! That way your program behaves regularly/as convention goes everywhere else, and existing programs you run can also benefit without re-writing!

I cannot emphasize enough how many excellent well integrated kick ass security features systemd gives you totally for free. DynamicUser= turns on PrivateTmp= by default and is an easy way to insure isolation, to prevent needing to hand-code & safely manage uid/gids yourself; I'd start there if you can.

There's so so so many great isolation features in this man page.

replies(2): >>41914119 #>>41915241 #
4. nullindividual ◴[] No.41913905[source]
You'd need to pin pages in physical memory to guarantee it stays in physical memory. What happens if an 'attacker' (or accidental user) exceeds available physical memory? OOM Kill other applications? Just don't accept temp data, leading to failures in operations requested by the user or system?

Pages in physical memory are not typically zero'ed out upon disuse. Yes, they're temporary... but only guaranteed temporary if you turn the system off and the DRAM cells bleed out their voltage.

replies(3): >>41913943 #>>41913945 #>>41915792 #
5. 0xC0ncord ◴[] No.41913908[source]
This exact thing is possible with pam_namespace.so!
replies(1): >>41913992 #
6. pama ◴[] No.41913910[source]
The /tmp in RAM does not address any of the vulnerabilities unfortunately.
replies(1): >>41913919 #
7. tmountain ◴[] No.41913914[source]
Things goes along with the author's "tmp cleanup" section, but I have lost valuable work on a number of occasions from hacking on random files that I created in /tmp under the assumption that they were throwaway junk files, only to reboot my machine a few hours later and have them automatically deleted by the OS. It's much safer and just as easy to use a "$HOME/tmp" dir as a junk drawer and then manually clean it up from time to time.
replies(4): >>41913944 #>>41913967 #>>41914063 #>>41914729 #
8. noirscape ◴[] No.41913918[source]
It's also the default on most distros these days since it means /tmp is always wiped on every reboot. (For a programming side, this also means that if you write a file to /tmp, it'll probably have the fastest read/write speed you can find on the OS, which can be desirable.)
9. Aardwolf ◴[] No.41913919{3}[source]
At least the 'tmp cleanup' related ones from the article
replies(1): >>41913932 #
10. notamy ◴[] No.41913926[source]
For a janky way of doing it, create a new mount namespace, then bind-mount $HOME/.tmp over /tmp. In practice better ways (ex. sibling comment) exist and you should use those.
11. pama ◴[] No.41913932{4}[source]
No not really. These are there for long running jobs. Reboot clean up of tmp is not an issue.
12. jmclnx ◴[] No.41913937[source]
What I do is all users get TMPDIR set to /tmp/$USER and /etc/rc.d/rc.local will create these as 700 on boot. Plus a script in /etc/profile.d/ will set TMPDIR on login for the users. With this you get /tmp cleanup on boot.

As as someone said, you can mount /tmp as tmpfs if you can spare the memory.

replies(1): >>41915540 #
13. ricardo81 ◴[] No.41913941[source]
I guess the general gist is shared spaces between users causes security issues.

I recall using 'shared hosting' where instead of using your default IP address for fetching anything from the network, you could do some funky stuff in the shared environment to discover many more IPs that could be used. Useful for scraping and such. Generally any shared hosting that used cpanel would expose all their network interfaces, often a /24 or two.

replies(1): >>41914050 #
14. Aardwolf ◴[] No.41913943{3}[source]
I use this with a size of a few GB: https://wiki.archlinux.org/title/Tmpfs
15. zimpenfish ◴[] No.41913944[source]
Pro* tip: don't put your mSQL database file on /tmp on a Solaris box.

Because at some point a few months later people will say "where did the database go?" and you'll have a lot of explaining and reconstruction to do.

(mid 90s)

replies(1): >>41914338 #
16. noirscape ◴[] No.41913945{3}[source]
By default a tmpfs has a really low RAM priority so the OS will try to move it in swapspace if memory gets low. tmpfs size is specified on creation of the tmpfs (and cant be larger than the total memory available, which is swap + RAM) but it's only "occupied" when files begin to fill the tmpfs.

If it gets too full for regular OS operations, you get the fun of the OOM Killer shutting down services (tmpfs is never targeted by the OOM Killer) until the entire OS just deadlocks if you somehow manage to fill the tmpfs up entirely.

replies(1): >>41913983 #
17. Joker_vD ◴[] No.41913946[source]
> The fix, way back when, should have been for login(8) to create a per-user temporary directory in a sensible place before it drops privilege, and set $TMPDIR so the user’s shell and child processes can find it.

Something like

    tmpdir := "/tmp/${USERNAME}"
    loop:
        rmdir(tmpdir, recurse=true)
        while not mkdir(tmpdir, 0o700, must-create=true)
    chown(tmpdir, user=$USERNAME, group=$USERGROUP)
    export("TMPDIR", tmpdir)
with /tmp having root:root owner with 0o775 permissions on it? Yeah, would've been nice.
replies(2): >>41914009 #>>41914158 #
18. Joker_vD ◴[] No.41913967[source]
> valuable work

> created ... under the assumption that they were throwaway junk files

Don't leave your valuables in the office trash bins (they get cleaned every 3 hours), what else can I say?

19. 0xC0ncord ◴[] No.41913968[source]
I'm amazed that polyinstantiation of directories via pam_namespace.so[1] is so unheard of. Setting this up fixes almost all of the qualms mentioned in the article by giving each user their own mount namespace with an isolated /tmp directory (and others if configured). Still though, this wouldn't prevent poorly written applications using /tmp from clashing with others that are running under the same user.

It's relatively easy to set up[2] and provides a pretty huge defense mitigation against abusing /tmp.

[1] https://www.man7.org/linux/man-pages/man8/pam_namespace.8.ht...

[2] https://docs.redhat.com/en/documentation/red_hat_enterprise_...

replies(3): >>41914558 #>>41914916 #>>41915729 #
20. nullindividual ◴[] No.41913983{4}[source]
> OS will try to move it in swapspace if memory gets low

That defeats the idea GP presented.

replies(2): >>41914042 #>>41914260 #
21. CarpaDorada ◴[] No.41913992{3}[source]
Very nice, thank you. I will look into this. This may be my break into PAM that I've ignored thus far.

I'm wondering if there's programs that will break with such a change. One example would be if multiple users in a group need access to the same file under /tmp.

replies(1): >>41914126 #
22. udev4096 ◴[] No.41914008[source]
The only thing I know about /tmp is that it's accessible by all users, privileged or not, which is quite helpful when you are escalating your user privilege on a box
23. nullindividual ◴[] No.41914009[source]
Why not both, like Windows?

$HOME/.tmp for user operations and /tmp for system operations?

EDIT: I see from other posters it can be done. Why the heck isn't this the default?!

replies(3): >>41914083 #>>41914609 #>>41915408 #
24. layer8 ◴[] No.41914033[source]
> Probably the main reason was path-dependence

Nice pun. :)

25. noirscape ◴[] No.41914042{5}[source]
That depends on how you view swapspace; on most devices, swapspace is either created as a separate partition on the disk or as a file living somewhere on the filesystem.

For practical reasons, swapspace isn't really the same thing as keeping it in an actual storage folder - the OS treats swapspace as essentially being empty data on each reboot. (You'd probably be able to extract data from swapspace with disk recovery tools though.)

On a literal level it's not the same as "keep it in RAM", but practically speaking swapspace is treated as a seamless (but slower) extension of installed RAM.

replies(1): >>41914155 #
26. deltaburnt ◴[] No.41914050[source]
Any shared resource seems to give rise to security issues. Extracting data through side channels in the hardware's architecture is what woke me up to this.
replies(3): >>41914109 #>>41914140 #>>41915494 #
27. hulitu ◴[] No.41914053[source]
> Against /Tmp

This is like a pope talking about celibacy.

Did he try to remove /tmp entirely and see how it goes ?

replies(1): >>41914695 #
28. Aissen ◴[] No.41914054[source]
That does not expand on the whole TOCTOU-style family of bugs, which permeates all APIs, and the only solution is to manipulate everything by file descriptor; Linux has many syscalls for that: openat, mkdirat, renameat(2), unlinkat, execveat, (new)fstatat, symlinkat, faccessat, fchmodat, fchownat, linkat, mknodat, pidfd_*, etc.

Arguably, many are not relevant to /tmp, but it's good to keep in mind.

29. pjmlp ◴[] No.41914057[source]
So here we have again how "Worse is better" works in practice, and how we got here regarding /tmp in 2024.
replies(1): >>41914337 #
30. akdev1l ◴[] No.41914063[source]
You can use /var/tmp for this purpose

It is not cleared between reboots

replies(2): >>41914167 #>>41914745 #
31. irunmyownemail ◴[] No.41914072[source]
I use a tmp dir in my home folder on my machines too, I like the idea of tmp.
32. yxhuvud ◴[] No.41914083{3}[source]
What system operations exist that need temp storage shouldn't have a separate user anyhow?
replies(1): >>41914134 #
33. ricardo81 ◴[] No.41914109{3}[source]
I remember digging into this 10-15 years ago. 'shared hosting' per provider had some arbitrary resource restrictions, but you could still find out via a cron job or some such. Like `cat`ting /etc/network stuff. Basically a sieve.
34. bloopernova ◴[] No.41914119[source]
That is very cool, thank you for sharing it.

I wonder if Fedora does this by default?

35. 0xC0ncord ◴[] No.41914126{4}[source]
pam_namespace normally isolates /tmp by user or SELinux context, so your example might require a couple tweaks. I haven't tried any of these but I'm thinking any of:

1) You could modify the namespace init script used by pam_namespace to also mount a shared directory under each user's /tmp, and do this only for the users who need it.

2) Rely on a different shared directory for the users who need it.

3) Configure namespace.conf to isolate by SELinux context and put each user who needs a shared /tmp into the same SELinux role.

replies(1): >>41914229 #
36. nullindividual ◴[] No.41914134{4}[source]
I see where you're going with your question, but like Windows' Services/scheduled tasks, most of those 'users' don't have a $HOME folder.

Not to say they couldn't have one!

replies(1): >>41915041 #
37. TeMPOraL ◴[] No.41914140{3}[source]
That's true of physical reality itself. Everything that happens constantly leaks information to the surrounding, spreading outward at the speed of light.

Point being, there always are side channels.

38. nullindividual ◴[] No.41914155{6}[source]
> On a literal level it's not the same as "keep it in RAM"

I read the GP as 'literal level' in-RAM. If I interpreted that incorrectly, apologies to GP.

replies(1): >>41915723 #
39. tgv ◴[] No.41914158[source]
MacOS does something like this. Not by username, but through /private, which is a private mount, and then /tmp is linked to /private/tmp, as are /var and /etc.
replies(1): >>41914918 #
40. TeMPOraL ◴[] No.41914165[source]
In which people forget that computers have other purposes beyond being boxes for CTF competitions. Shared mutable global state isn't always bad.
replies(3): >>41914370 #>>41914775 #>>41916491 #
41. SoftTalker ◴[] No.41914167{3}[source]
Depends on the OS. In OpenBSD, /var/tmp is a symlink to ../tmp and is so is cleaned on reboots and periodically.
replies(1): >>41914576 #
42. CarpaDorada ◴[] No.41914229{5}[source]
What occurs to me now is that with a proper SELinux configuration you do not even need per-user /tmp, you can use the old /tmp for all. It is still motivating to look into PAM, but perhaps also motivating to learn more about SELinux that I've also put off.
43. dspillett ◴[] No.41914260{5}[source]
Only if memory gets low, otherwise it'll stay in RAM and give the benefit GGP intended. IIRC tmpfs data shouldn't be evicted to swap just to allow more room for cache, or if an app requests a large chunk of memory but doesn't use it, just to allow more room for application pages that are actively in use.

Normal case: tmpfs data stays in RAM

Worst case: it is pushed to swap partitions/files, which is no worse than it being in a filesystem on physical media to start with (depending on access patters and how swap space is arranged it may still be a little more efficient).

It isn't quite the same as /tmp being on disk anyway but under normal loads in cache, because the data will usually get written to disk even if only ever read from cache and the cached data from disk will be evicted to make room for caching other data where tmpfs data is less likely to.

44. anthk ◴[] No.41914337[source]
As if C:\TEMP or %tmpdir% were any better.

Or using letters as drivers.

Worse is better? A lot of tech in Win32 is built as if it were for DOS 1.0 or CP/M. See AUX, PRN, COM and so.

replies(3): >>41914828 #>>41915035 #>>41915497 #
45. hulitu ◴[] No.41914338{3}[source]
I think this one was in the "Unix admin horror stories"
replies(2): >>41914686 #>>41915525 #
46. inetknght ◴[] No.41914370[source]
> Shared mutable global state isn't always bad.

I agree, but I think that shared mutable global state is a bad default. I think it'd be better to be opt-in (eg, you get a `/tmp/${USER}` and your user can `chmod o+rw` during setup if it needs to be globally mutable.

47. yjftsjthsd-h ◴[] No.41914558[source]
There's also https://www.freedesktop.org/software/systemd/man/latest/syst... to do the same for services if you use systemd.
48. akdev1l ◴[] No.41914576{4}[source]
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.htm...

Yeah it’s a Linux/FHS thing.

49. gspencley ◴[] No.41914609{3}[source]
IMO even a home-level, per-user tmp directory isn't ideal (though it is better). In a single-user environment, where malware is the biggest concern in current times, what difference does it make if it's a process running under a different user or one that is running under your current user that is attacking you?

In other words, for many systems, a home-level temp directory is virtually the same as /tmp anyway since other than system daemons, all applications are being started as a single user anyway.

And that might be a security regression. For servers you're spinning up most services at bootup and those should either be running fully sandboxed from each other (containerization) or at least as separate system users.

But malware doesn't necessarily need root, or a daemon process user id to inflict harm if it's running as the human user's id and all temp files are in $HOME/.tmp.

What you really want is transient application-specific disk storage that is isolated to the running process and protected, so that any malware that tries to attack another running application's temp files can't since they don't have permission even when both processes are running under the same user id.

At that point malware requires privilege escalation to root first to be able to attack temp files. And again, if we're talking about a server, you're better off running your services in sandboxes when you can because then even root privilege escalation limits the blast radius.

replies(2): >>41914722 #>>41914869 #
50. rnd0 ◴[] No.41914627[source]
I thought that was the standard in Linux, at least. I'm not sure how they do it in the BSDs.
51. zimpenfish ◴[] No.41914686{4}[source]
Wish I'd read that before I did it then.
52. yjftsjthsd-h ◴[] No.41914695[source]
That makes little sense; the author's complaint amounts to "programs should not use /tmp", so removing it before fixing all programs would be putting the cart before the horse.
53. nullindividual ◴[] No.41914722{4}[source]
> In a single-user environment, where malware is the biggest concern in current times, what difference does it make if it's a process running under a different user or one that is running under your current user that is attacking you?

In these systems, the responsibility passes to EDRs or similar. But neither a $HOME/.tmp or /tmp matter in these scenarios. _Shared_ systems are where the concept of $HOME/.tmp might be more interesting.

54. ziml77 ◴[] No.41914729[source]
It's best to assume that any directory which holds temporary files for applications will be cleaned up at any time. The whole point of those directories is to hold things that need to exist somewhere but are ephemeral.
55. NekkoDroid ◴[] No.41914745{3}[source]
Do note that systemd does have a tmpfiles.d (terrible name nowadays, but that is besides the point) drop-in with an extra service that will clean out /var/tmp/ of unused files when they haven't been accessed within 30 days (all of a/m/ctime are checked). Same applies to /tmp/ but with 10 days. I don't know if the service is enable by default on any distros though, so assume it is unless otherwise ensured :)
56. pjc50 ◴[] No.41914775[source]
If your machine is on the Internet in any way, you're taking part in the big ongoing global CTF.
57. josephcsible ◴[] No.41914801[source]
If you're opening with O_CREAT|O_EXCL, why does it matter whether the filename is predictable?
replies(2): >>41914941 #>>41915153 #
58. pjc50 ◴[] No.41914828{3}[source]
Backward compatibility, innit.

Microsoft have tried to get people to use the newer, more heavily sandboxed APIs like UWP, but only very weakly, and they haven't committed to transitioning their own apps over as dogfood. Nearest they've got is actually migrating a lot of office to the cloud as Office365.

Sunsetting Win32, or even having significant backwards-compatibility breaks, would upset so many corporate customers who would then refuse to upgrade.

59. pjc50 ◴[] No.41914869{4}[source]
> In a single-user environment, where malware is the biggest concern in current times, what difference does it make if it's a process running under a different user or one that is running under your current user that is attacking you?

Very true, and this is a real weakness of the UNIX (and Windows, even worse!) style security model in the modern environment. Android/iOS do a lot better.

replies(1): >>41915772 #
60. aidenn0 ◴[] No.41914876[source]
> It’s a bad idea because it’s shared global mutable state that crosses security boundaries.

I think there is a use for such a thing (I take advantage of these features somewhat regularly), but having it also be the default $TMPDIR is definitely a bad idea.

replies(1): >>41915064 #
61. aidenn0 ◴[] No.41914916[source]
Is there an easy way to duplicate a specific process' namespace? My biggest issue with all these new features is that privatize state is how much harder it is to reproduce a state.

Back when it was just environment variables, I could pipe /proc/PID/environ to xargs and get basically the same state. Given that things like unix domain sockets may end up in $TMPDIR, I can be left unable to do certain things.

replies(3): >>41915034 #>>41915231 #>>41915256 #
62. js2 ◴[] No.41914918{3}[source]
You're right that macOS has per-user temp (and cache) dirs under /private/var/folders/ (since 10.5), but it still has traditional shared /tmp (via the /private/tmp symlink) since not everything respects the per-user temp dir.

https://magnusviri.com/what-is-var-folders.html

That's not the reason for /private though. Rather, /private is a holdover from NeXTSTEP days which could mount the OS via NFS (NetBoot), and where /private was local to the machine:

"Each NetBoot client will share the server's root file system, but there are several administrative files (such as the NetInfo database, log files, and the swapfile) that must be unique to each client. The server must have a separate directory tree for each client, which the client mounts on its own /private directory during startup. This lets a client keep its own files separate from those of other clients."

https://www.nextcomputers.org/files/manuals/nsa/13_NetBoot.h...

replies(1): >>41915185 #
63. kijin ◴[] No.41914941[source]
Because other processes can periodically check whether a predictable filename is in use, and guess things you'd rather keep private?
replies(2): >>41915014 #>>41916172 #
64. stabbles ◴[] No.41914979[source]
To hide `/tmp` from other processes and users, I sometimes use `bwrap --dev-bind / / --tmpfs /tmp <command>`.

Unfortunately Ubuntu 24.04 has put restrictions on unprivileged user namespaces, so that it no longer works out of the box :(

65. johnisgood ◴[] No.41915014{3}[source]
Why would you have processes you do not trust, or why not use firejail for those that may pose a security risk?

> Firejail is a SUID sandbox program that reduces the risk of security breaches by restricting the running environment of untrusted applications using Linux namespaces, seccomp-bpf and Linux capabilities. It allows a process and all its descendants to have their own private view of the globally shared kernel resources, such as the network stack, process table, mount table. Firejail can work in a SELinux or AppArmor environment, and it is integrated with Linux Control Groups.

It supports "--private" (mounts new /root and /home/user directories in temporary filesystems), along with "--private-{bin,cache,cwd,dev,etc,home,lib,opt,srv,tmp} (plus "noexec /tmp")". It also supports "keep-config-pulse", "keep-dev-shm", and so forth, meaning you can have shared files between process if you so wish (for DBus, etc.).

66. zbentley ◴[] No.41915034{3}[source]
I don't think there is, or should be, a way to do that. Granular copying of per-process resource state seems like a need that would be better served at either a closer-to-the-program layer (i.e. debug hooks in code you control that provide information on how to reconstruct its state) or much further away (e.g. via CRIU/whole-machine snapshots or scary tricks like SIGSTP or ptrace-injecting calls to fork(2)).

> I can be left unable to do certain things

Most of what I can imagine of "certain things" falls into two categories: debugging (for which much better tools exist), or concerns that would be better served by a program providing an API of some kind rather than "go muck with state in $TMPDIR".

replies(1): >>41915197 #
67. tredre3 ◴[] No.41915035{3}[source]
> As if C:\TEMP or %tmpdir% were any better.

I mean, yes? %tmp% is in the user's directory, not accessible by the world.

replies(1): >>41916486 #
68. GoblinSlayer ◴[] No.41915041{5}[source]
Services on windows have home folder e.g. in \Windows\ServiceProfiles\LocalService
69. zbentley ◴[] No.41915064[source]
I think this is an instance where, to crib a phrase from the golang world, "share memory by communicating" (i.e. programs that need to support this kind of intervention should provide some form of API) is more appropriate than "communicate by sharing memory" (mucking about with programs' runtime state in tmpfs).

I replied to your similar comment upthread as well.

replies(1): >>41915228 #
70. fanf2 ◴[] No.41915153[source]
Denial of service, the next point in that list.
71. lelandfe ◴[] No.41915185{4}[source]
Thanks for that first link, explained some stuff I've been curious about
72. aidenn0 ◴[] No.41915197{4}[source]
Here's a recent one; I needed to play some sound via an ssh login session. A Wayland/pipewire session was already open. I was able to do this just by copying a running processes environment. With enough containerization &c. I'll need to do more things to do that, if it's at all possible.

Also, /proc/ is (among other things) a debug interface.

73. scottlamb ◴[] No.41915221[source]
> There should be per-user temporary directories. In fact, on modern systems there are per-user temporary directories!

On Linux+systemd, I think this is referring to /run/user/$UID. $XDG_RUNTIME_DIR is set to this path in a session by default. There's a spec for that environment variable at <https://specifications.freedesktop.org/basedir-spec/latest/>. I assume there's also some systemd doc talking about this.

On macOS, I see that $TMPDIR points to a path like /var/folders/jd/d94zfh8d1p3bv_q56wmlxn6w0000gq/T/ that appears to be per-user also.

What do FreeBSD/OpenBSD/NetBSD do?

replies(1): >>41916623 #
74. aidenn0 ◴[] No.41915228{3}[source]
Once shells have easy-to-use support for sending and receiving data between two sessions running as two users, then maybe we can get rid of shared filesystem directories.

I think /tmp is a poor solution even if we are going to use the filesystem for this (some sort of per-user spool makes far more sense), but its value is in its ubiquity.

75. xerxes901 ◴[] No.41915231{3}[source]
/proc/PID/root is a view of that process’s mount namespace.

Also you can use nsenter(8) to run a command (or even a shell) under another process’s mount, pid, network, etc namespace.

replies(2): >>41915244 #>>41915312 #
76. GoblinSlayer ◴[] No.41915241[source]
Happy debugging, yeah. FastCGI examples usually create sockets in /tmp, but nginx doesn't see them, go figure.
77. aidenn0 ◴[] No.41915244{4}[source]
Thanks!

It's exactly what I was looking for, and the world can now continue to improve without breaking any of my workflows :)

78. zokier ◴[] No.41915256{3}[source]

    nsenter --all --target $PID
or something like that?

https://man7.org/linux/man-pages/man1/nsenter.1.html

79. zokier ◴[] No.41915312{4}[source]
mount namespace and root directory are bit different things though.

/proc/$PID/ns is the place to look for namespaces

80. ndsipa_pomu ◴[] No.41915408{3}[source]
I'm guessing, but I would think that the idea is to have all the junk in one place so that it can be safely cleared at startup and excluded from backups.

If the user tmp files were placed in /tmp/${USER}/ then that would achieve the same goal.

81. stevekemp ◴[] No.41915494{3}[source]
I recently had to copy a secret which was available in a CI-job to a new repository, but the system was smart enough to filter it if echoed literally.

So "echo $API_TOKEN" failed, but getting the output of the complete environment was as easy as "env | base64".

82. pjmlp ◴[] No.41915497{3}[source]
Yeah, nice jab attempt, except no one sells MS-DOS decisions as some grandiose OS architecture design.

Its origins are quite clear, QDOS, Quick and Dirty Operating System.

https://en.m.wikipedia.org/wiki/86-DOS

83. stevekemp ◴[] No.41915525{4}[source]
Like those users who start with Linux, and later move to Solaris only to learn "killall" does something different there..

In my defense I only did it the once.

84. stevekemp ◴[] No.41915540[source]
Back in the day I used libpam-tmpdir for that purpose - it covered SSH and other services that used PAM.
85. fforflo ◴[] No.41915602[source]
Whenever I find myself needing /tmp, it's usually as a form of IPC shared memory, in which case I use /dev/shm directly.
86. gnramires ◴[] No.41915682[source]
I really think there are quite a few reforms and new ideas that could help Unixes. Also it's not only about introducing features/new ways, but also the right culture and instruction around the new ways.

For example, the Android(/iOS?) permission based model at kernel level where apps (that could be processes in general?) can only access some private storage (which presumably has its own isolated tmp/ directory) really should be default, and permissions should be opt-in (of course, there should be a 'legacy permission' that makes things work as before).

(I believe most of permission functionality is technically possible through SELinux (??), or you could use containers, but is not easy to use or default)

I think containers arose partially to provide some of this isolation? But they have their own overhead and redundancy issues.

---

It seems some of this work is being done in SELinux project? Is it going to be enough? (and easy enough to use by default?)

https://wiki.archlinux.org/title/SELinux

I think a simple permission model might have been more elegant than the SELinux model ?

replies(1): >>41916529 #
87. marcosdumay ◴[] No.41915723{7}[source]
It may or may not be what the OP was talking about, depending on your threat model.
88. Starlevel004 ◴[] No.41915728[source]
The actual answer is to use O_TMPFILE.
89. fanf2 ◴[] No.41915729[source]
Lovely, another layer of complexity to increase the safety of a fundamental mistake that we can no longer fix!
90. marcosdumay ◴[] No.41915772{5}[source]
> Android/iOS do a lot better.

They would if they were designed with the user's security in mind, instead of Google's/Apple's control.

But I disagree, they don't do better at all. Any software that wants to get access to everything just needs to insist.

replies(1): >>41916515 #
91. RiverCrochet ◴[] No.41915792{3}[source]
Well I guess you could tell Linux to not use some memory addresses using the BadRAM feature, then setup an `mtd` device to those memory addresses and create a RAM-based block device, then use `cryptsetup` to encrypt it. If your Linux box is headless and you have a GPU with RAM there mostly sitting unused then you could use the VRAM.
92. tolciho ◴[] No.41916103[source]
This is fine until something uses more memory than is available, such as sox insisting on routing a huge audio file though a too-small /tmp, or the MATLAB installer likewise only using /tmp. With sox you could in theory recompile to get it to use some other path (iirc none of the TMP or TMPDIR environment variables did anything), but I instead gave up on the /tmp in memory (it complicated the OpenBSD desktop setup). I forget exactly how I worked around the MATLAB installer issue, probably something horrible involving LD_PRELOAD or time wasted reconfiguring and rebooting and reconfiguring and rebooting one node to do the install on, plus more time wasted running the massive and bloated installer process(es) under strace to see exactly what file paths were in play.

So, not really a fan of /tmp in memory. (And I don't much run massive and bloated browsers that may murder your SSD lifetime with excessive file writes better diverted to an in-memory /tmp.)

93. josephcsible ◴[] No.41916172{3}[source]
But you wouldn't need to guess names to do that, since the names of files in /tmp are publicly listable.
94. anthk ◴[] No.41916486{4}[source]
TMPDIR can be trivially set at $HOME/tmp too with just a file at /etc/profile
95. samatman ◴[] No.41916491[source]
There are very few always in such matters, but I view this one as an 'except for rare circumstances'. Even when true, it should be modeled as "contained state where the container includes everyone".

The problem is that Unices use access control, rather than capabilities, so ensuring state is shared only by those who need it is quite a bit more difficult than just punting, and declaring that 'those who need it' is 'everyone'.

Nor has the design problem of a user-friendly capabilities architecture truly been solved, IHMO. Nonetheless, we shouldn't confuse convenience with correctness.

96. anthk ◴[] No.41916515{6}[source]
Check pledge/unveil under OpenBSD. You get isolated software yet with freedoms.
97. anthk ◴[] No.41916529[source]
Pledge/unveil it's intristic, per software, under OpenBSD.
98. cryptonector ◴[] No.41916623[source]
Unfortunately /run/user/$UID/ is NOT universally available.

On Linux it's typically created by a PAM, so if you're not using PAM then it doesn't exist. This means that on Kubernetes pods/containers... it doesn't exist!

Yes, /tmp/ is a security nightmare on multi-user systems, but those are a rarity nowadays.

Lots of things want to write things into /tmp, like Kerberos, but not only. I recently implemented a token file-based cache for JWT that... is a lot like a Kerberos ticket cache. I needed it because the tokens all have specific aud (audience) values. Now where to keep that cache?? The only reasonable place turned out to be /tmp/ precisely because /run/user/$UID/ is not universally available, not even on Linux.

99. cryptonector ◴[] No.41916661[source]
The right answer is to use /run/user/${UID}/. Unfortunately that's not universally available, not even on Linux. If you don't use PAM in the process of starting the user processes in question, then you won't have /run/user/${UID}/. That's because on Linux /run/user/${UID}/ is made by a PAM. Kubernetes does not use PAM, naturally, so you don't get this on Kubernetes.

This is supremely annoying. /run/user/${UID}/ needs to exist universally. Ugh.

100. danans ◴[] No.41916754[source]
I get that /tmp as a shared world readable location is a security issue, but in a day of easy-to-provision VMs, serverless architectures, are there many true multiuser (not multi tenant) systems out there, in the sense of multiple users logging into the same logical system to complete compute tasks?