Przeglądaj źródła

Merge remote-tracking branch 'mvo/feature/drop-rights' into debian/experimental

Conflicts:
	apt-pkg/contrib/fileutl.cc
	apt-pkg/contrib/fileutl.h
Michael Vogt 12 lat temu
rodzic
commit
17091f2f33

+ 18 - 0
apt-pkg/contrib/fileutl.cc

@@ -47,6 +47,7 @@
 #include <signal.h>
 #include <errno.h>
 #include <glob.h>
+#include <pwd.h>
 
 #include <set>
 #include <algorithm>
@@ -2166,3 +2167,20 @@ bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode)
 
    return true;
 }
+
+bool DropPrivs()
+{
+   if (getuid() != 0)
+      return true;
+
+   const std::string nobody = _config->Find("APT::User::Nobody", "nobody");
+   struct passwd *pw = getpwnam(nobody.c_str());
+   if (pw == NULL)
+      return _error->Warning("No user %s, can not drop rights", nobody.c_str());
+   if (setgid(pw->pw_gid) != 0)
+      return _error->Errno("setgid", "Failed to setgid");
+   if (setuid(pw->pw_uid) != 0)
+      return _error->Errno("setuid", "Failed to setuid");
+
+   return true;
+}

+ 4 - 0
apt-pkg/contrib/fileutl.h

@@ -193,9 +193,13 @@ pid_t ExecFork(std::set<int> keep_fds);
 void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds);
 bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
 
+
 // check if the given file starts with a PGP cleartext signature
 bool StartsWithGPGClearTextSignature(std::string const &FileName);
 
+// process releated
+bool DropPrivs();
+
 // File string manipulators
 std::string flNotDir(std::string File);
 std::string flNotFile(std::string File);

+ 2 - 0
cmdline/apt-dump-solver.cc

@@ -40,6 +40,8 @@ int main(int argc,const char *argv[])					/*{{{*/
 		ShowHelp();
 		return 0;
 	}
+        // we really don't need anything
+        DropPrivs();
 
 	FILE* input = fdopen(STDIN_FILENO, "r");
 	FILE* output = fopen("/tmp/dump.edsp", "w");

+ 3 - 0
cmdline/apt-internal-solver.cc

@@ -74,6 +74,9 @@ int main(int argc,const char *argv[])					/*{{{*/
 		{'o',"option",0,CommandLine::ArbItem},
 		{0,0,0,0}};
 
+        // we really don't need anything
+        DropPrivs();
+
 	CommandLine CmdL(Args,_config);
 	if (pkgInitConfig(*_config) == false ||
 	    CmdL.Parse(argc,argv) == false) {