blob: b0cce76d17b656cdb835e17b7a4a30f95db9e797 [file] [log] [blame]
<html lang="en">
<head>
<title>Tips for Setuid - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Users-and-Groups.html#Users-and-Groups" title="Users and Groups">
<link rel="prev" href="Setuid-Program-Example.html#Setuid-Program-Example" title="Setuid Program Example">
<link rel="next" href="Who-Logged-In.html#Who-Logged-In" title="Who Logged In">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Tips-for-Setuid"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Who-Logged-In.html#Who-Logged-In">Who Logged In</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Setuid-Program-Example.html#Setuid-Program-Example">Setuid Program Example</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Users-and-Groups.html#Users-and-Groups">Users and Groups</a>
<hr>
</div>
<h3 class="section">29.10 Tips for Writing Setuid Programs</h3>
<p>It is easy for setuid programs to give the user access that isn't
intended&mdash;in fact, if you want to avoid this, you need to be careful.
Here are some guidelines for preventing unintended access and
minimizing its consequences when it does occur:
<ul>
<li>Don't have <code>setuid</code> programs with privileged user IDs such as
<code>root</code> unless it is absolutely necessary. If the resource is
specific to your particular program, it's better to define a new,
nonprivileged user ID or group ID just to manage that resource.
It's better if you can write your program to use a special group than a
special user.
<li>Be cautious about using the <code>exec</code> functions in combination with
changing the effective user ID. Don't let users of your program execute
arbitrary programs under a changed user ID. Executing a shell is
especially bad news. Less obviously, the <code>execlp</code> and <code>execvp</code>
functions are a potential risk (since the program they execute depends
on the user's <code>PATH</code> environment variable).
<p>If you must <code>exec</code> another program under a changed ID, specify an
absolute file name (see <a href="File-Name-Resolution.html#File-Name-Resolution">File Name Resolution</a>) for the executable,
and make sure that the protections on that executable and <em>all</em>
containing directories are such that ordinary users cannot replace it
with some other program.
<p>You should also check the arguments passed to the program to make sure
they do not have unexpected effects. Likewise, you should examine the
environment variables. Decide which arguments and variables are safe,
and reject all others.
<p>You should never use <code>system</code> in a privileged program, because it
invokes a shell.
<li>Only use the user ID controlling the resource in the part of the program
that actually uses that resource. When you're finished with it, restore
the effective user ID back to the actual user's user ID.
See <a href="Enable_002fDisable-Setuid.html#Enable_002fDisable-Setuid">Enable/Disable Setuid</a>.
<li>If the <code>setuid</code> part of your program needs to access other files
besides the controlled resource, it should verify that the real user
would ordinarily have permission to access those files. You can use the
<code>access</code> function (see <a href="Access-Permission.html#Access-Permission">Access Permission</a>) to check this; it
uses the real user and group IDs, rather than the effective IDs.
</ul>
</body></html>