在符号链接的情况下安全地更新文件 - C
Update a file securely incase of symbolic links - C
我想知道是否有人可以帮助我解决这个问题,我正在尝试弄清楚如何处理检查时间、使用时间问题以及在不需要时删除权限,以防万一文件的符号 link 可以更改为影子文件。假设在调用进程 运行 提升权限时调用下面的函数。
int
updatefile(char *file)
{
int fd;
if (access(file, R_OK|W_OK)) {
perror("access()");
return (-1);
}
fd = open(file, O_RDWR);
/*
* file is written to here.
*/
printf("Updated %s on...\n", file);
system("date");
/*
* elevated privileges are required here...
*/
return (0);
}
假设您的 access
函数检查文件类型并确定用户是否具有操作文件的适当权限,您担心调用 access
和调用 open
.
避免这种情况的典型方法是:
int updatefile(char *file)
{
int fd = -1;
if(-1 != (fd = open(file, R_OK | W_OK)))
{
struct stat buf;
if(0 == fstat(fd, &buf))
{
/* perform any necessary check on the here */
/* do what ever else you need to do */
/* write to the file here */
/* gain elevated permissions here */
/* do privileged task */
/* drop back to normal permissions here */
close(fd);
}
else
{
/* handle error stating the file */
}
}
else
{
/* handle error for not opening file */
}
}
之所以可行,是因为我们推迟对文件进行任何检查,直到我们对文件进行 "handle" 之后。我们可以通过外层else块中errno
的值判断用户是否没有打开文件的权限;
如果我们能够获得文件的 "handle",那么我们就可以进行我们想要的任何检查。因为我们从打开文件开始一直维护 "handle",一直到执行检查,最后使用文件;恶意软件无法在检查和使用之间修改文件系统。
希望对您有所帮助
T.
我想知道是否有人可以帮助我解决这个问题,我正在尝试弄清楚如何处理检查时间、使用时间问题以及在不需要时删除权限,以防万一文件的符号 link 可以更改为影子文件。假设在调用进程 运行 提升权限时调用下面的函数。
int
updatefile(char *file)
{
int fd;
if (access(file, R_OK|W_OK)) {
perror("access()");
return (-1);
}
fd = open(file, O_RDWR);
/*
* file is written to here.
*/
printf("Updated %s on...\n", file);
system("date");
/*
* elevated privileges are required here...
*/
return (0);
}
假设您的 access
函数检查文件类型并确定用户是否具有操作文件的适当权限,您担心调用 access
和调用 open
.
避免这种情况的典型方法是:
int updatefile(char *file)
{
int fd = -1;
if(-1 != (fd = open(file, R_OK | W_OK)))
{
struct stat buf;
if(0 == fstat(fd, &buf))
{
/* perform any necessary check on the here */
/* do what ever else you need to do */
/* write to the file here */
/* gain elevated permissions here */
/* do privileged task */
/* drop back to normal permissions here */
close(fd);
}
else
{
/* handle error stating the file */
}
}
else
{
/* handle error for not opening file */
}
}
之所以可行,是因为我们推迟对文件进行任何检查,直到我们对文件进行 "handle" 之后。我们可以通过外层else块中errno
的值判断用户是否没有打开文件的权限;
如果我们能够获得文件的 "handle",那么我们就可以进行我们想要的任何检查。因为我们从打开文件开始一直维护 "handle",一直到执行检查,最后使用文件;恶意软件无法在检查和使用之间修改文件系统。
希望对您有所帮助 T.