goldwarden-vaultwarden-bitw.../agent/sockets/callingcontext.go

94 lines
2.1 KiB
Go
Raw Normal View History

2023-07-17 03:23:26 +02:00
package sockets
import (
"net"
"os/user"
gops "github.com/mitchellh/go-ps"
"inet.af/peercred"
)
type CallingContext struct {
UserName string
ProcessName string
ParentProcessName string
GrandParentProcessName string
2023-09-12 18:56:35 +02:00
ProcessPid int
ParentProcessPid int
GrandParentProcessPid int
2024-01-19 07:32:41 +01:00
Error bool
Authenticated bool
2023-07-17 03:23:26 +02:00
}
func GetCallingContext(connection net.Conn) CallingContext {
creds, err := peercred.Get(connection)
errorContext := CallingContext{
UserName: "unknown",
ProcessName: "unknown",
ParentProcessName: "unknown",
GrandParentProcessName: "unknown",
ProcessPid: 0,
ParentProcessPid: 0,
GrandParentProcessPid: 0,
2024-01-19 07:32:41 +01:00
Error: true,
Authenticated: false,
}
2023-07-17 03:23:26 +02:00
if err != nil {
return errorContext
2023-07-17 03:23:26 +02:00
}
2024-01-19 07:32:41 +01:00
uid, _ := creds.UserID()
username, err := user.LookupId(uid)
if err != nil {
return errorContext
}
errorContext.UserName = username.Username
pid, ok := creds.PID()
if !ok {
return errorContext
}
2023-07-17 03:23:26 +02:00
process, err := gops.FindProcess(pid)
if err != nil {
return errorContext
}
if process == nil {
return errorContext
}
2023-09-19 22:27:03 +02:00
// git is epheremal and spawns ssh-keygen and ssh so we need to anchor to git
if process.Executable() == "ssh-keygen" || process.Executable() == "ssh" {
p, e := gops.FindProcess(process.PPid())
if p.Executable() == "git" && e == nil {
process, err = p, e
pid = process.Pid()
}
2023-09-19 22:14:03 +02:00
}
2023-07-17 03:23:26 +02:00
ppid := process.PPid()
if err != nil {
return errorContext
2023-07-17 03:23:26 +02:00
}
2023-09-12 02:54:46 +02:00
2023-07-17 03:23:26 +02:00
parentProcess, err := gops.FindProcess(ppid)
if err != nil {
return errorContext
2023-07-17 03:23:26 +02:00
}
parentParentProcess, err := gops.FindProcess(parentProcess.PPid())
if err != nil {
return errorContext
2023-07-17 03:23:26 +02:00
}
return CallingContext{
UserName: username.Username,
ProcessName: process.Executable(),
ParentProcessName: parentProcess.Executable(),
GrandParentProcessName: parentParentProcess.Executable(),
2023-09-12 18:56:35 +02:00
ProcessPid: pid,
ParentProcessPid: ppid,
GrandParentProcessPid: parentParentProcess.PPid(),
2024-01-19 07:32:41 +01:00
Error: false,
2023-07-17 03:23:26 +02:00
}
}