У меня есть довольно простая программа на С ++, которая должна безопасно управлять локальным «кэшем». Моя идея состояла в том, чтобы сделать исполняемый файл setuid-root и сохранить кеш в домашней директории root.
Я вхожу в режим setuid по телефону seteuid(0)
, После, я chroot
в корневой каталог root, затем попробуйте открыть кеш. Открытие завершается с ошибкой sqlite: unable to open database file
,
try {
/*
* open the SQLite DB.
*/
#ifdef DEBUG
syslog(LOG_AUTHPRIV | LOG_INFO,
"%s: am I root: uid=%d: euid=%d", __func__, getuid(), geteuid());
#endif
std::string rootDir = My::My::getRootDir();
if (chroot(rootDir.c_str()) != 0) {
snprintf(error, 1024, "%s: Could not chroot for cache: %s",
__func__, strerror(errno));
syslog(LOG_AUTHPRIV | LOG_INFO, "%s", error);
throw My::MyException(error);
}
/*
* Create a new cache DB without "other" privs
*/
umask(0007);
if ((sqlite3_open(My_Lib::LocalCache::DBCacheFileName.c_str(),
&sqlite)) != SQLITE_OK) {
if (sqlite == NULL) {
snprintf(error, 1024,
"%s: Could not open cache, dbh is null", __func__);
} else {
snprintf(error, 1024,
"%s: Could not open cache, dbh error: %s", __func__,
sqlite3_errmsg(sqlite));
}
syslog(LOG_AUTHPRIV | LOG_INFO, "%s", error);
throw My::MyException(error);
}
...
Оператор DEBUG syslog, который печатает реальные и эффективные uid, показывает реальный uid, подходящий для пользователя без полномочий root. Евид равен нулю. Пропуск в дом Root 750.
Что мне не хватает?
Задача ещё не решена.
Других решений пока нет …