aboutsummaryrefslogtreecommitdiff
path: root/pam/pam.go
AgeCommit message (Collapse)Author
2018-08-23Ensure setting user privileges is reversibleJoe Richey joerichey@google.com
This change makes sure after dropping then elevating privileges for a process, the euid, guid, and groups are all the same as they were originally. This significantly simplifies the privilege logic. This fixes CVE-2018-6558, which allowed an unprivleged user to gain membership in the root group (gid 0) due to the groups not being properly reset in the process.
2018-04-19Merge pull request #97 from ebiggers/privileges_fixJoseph Richey
security: drop and regain privileges in all threads
2018-03-25security: drop and regain privileges in all threadsEric Biggers
After enabling pam_fscrypt for "session" and creating a directory protected with a login protector, I was no longer able to log in as that user. The problem is that the Go runtime is creating threads after pam_fscrypt drops privileges, but pam_fscrypt is not re-acquiring privileges on those threads because the Go wrappers for setreuid(), setregid(), and setgroups() in the "sys/unix" package are using the raw syscalls which operate on the calling thread only. This violates glibc's assumption that all threads have the same uids and gids, causing it to abort() the process when a later module in the PAM stack (pam_mail in my case) tries to drop privileges using the glibc functions. Fix it by dropping and regaining privileges using the glibc functions rather than the "sys/unix" functions. This also avoids any possibility that privileges could be changed in a thread other than the "main" one for pam_fscrypt, since the Go runtime does not guarantee which OS-level thread runs what. It would be nice to also exit all Go worker threads before returning from pam_fscrypt, but the Go runtime doesn't seem to support that.
2018-03-24pam: return error when PAM info item is unsetEric Biggers
pam_fscrypt is crashing with a segfault in copyIntoSecret() when using Ctrl-C to interrupt a 'sudo' prompt. It is dereferencing a NULL pointer that is supposed point to the PAM_AUTHTOK item. The problem is that the Go code assumes pam_get_item() returns a non-success status if the item is unset, when actually it sets the data pointer to NULL and returns PAM_SUCCESS. Fix it by making pam.Handle.GetItem() return an error in that case.
2018-02-11vet: eliminate unnecessary shadowingJoseph Richey
Running "go vet -shadow ./..." finds all places where a variable might be incorrectly or unnecessarily shadowed. This fixes some of them.
2017-09-29security: Add check option to UserKeyringIDJoseph Richey
2017-09-01security: Change user keyring lookup algorithmJoseph Richey
Now instead of spawning a seperate thread we alternate between changing the euid and ruid to both find the keyring and link it to the process keyring. Note that we also ensure that the user keyring is linked into the root keyring whenever possible.
2017-09-01security: No more permenant privilege droppingJoseph Richey
This was creating an issue becasuse fully dropping privileges required spawning a goroutine and using rutime.DropOSThread().
2017-08-30pam: Handle holds data for calling and PAM usersJoe Richey
The functions are now changed to (Start|Stop)AsPamUser to indicate that they handle privilege modification and keyring setup.
2017-08-23pam_fscrypt: Session accounting completedJoe Richey joerichey@google.com
2017-08-23Added some documentation and improved security APIJoe Richey joerichey@google.com
2017-08-22pam_fscrypt: lock all PAM policies w/ flagJoe Richey joerichey@google.com
2017-08-17cmd/fscrypt: purge command now clears cacheJoe Richey joerichey@google.com
2017-07-17Small fixes so "make lint" doesn't complain.Joe Richey joerichey@google.com
2017-07-17pam: Added missing documentation (fix "make lint")Joe Richey joerichey@google.com
2017-07-17pam: Add Go wrappers around PAM functionsJoe Richey joerichey@google.com
This commit provides a Go interface to the PAM functions.