Как повысить уровень привилегий до root из программы на С++ в Linux

Я хотел бы изменить шлюз по умолчанию из кода C++. Я использую eclipse в качестве IDE. Ниже приведен мой код.

//change_gw.cpp
#include <iostream>
#include <unistd.h>

using namespace std;
//To execute terminal commands
std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);
    return result;
}

int main() {
    int euid = geteuid();
    int uid = getuid();
    cout<<"euid is "<<euid<<endl;
    cout<<"uid is "<<uid<<endl;
    int result = setreuid(euid,-1); //change the uid to euid (0 - root)
    if(result != 0) {
        cout<<strerror(errno)<<endl;
        return -1;
    }
    string result = exec("sudo route del default");
    if (result == "ERROR") {
        cout<<"del route failed"<<endl;
        return -1;
    }
    result = exec("sudo route add default gw ip dev iface");
    if (result == "ERROR") {
        cout<<"add route failed"<<endl;
        return -1;
    }
    cout<<"route changed succefully"<<endl;
    setreuid(uid,-1); //revert the changes to uid
    return 0;
}

Я успешно скомпилировал этот код и получил исполняемый файл. Компиляция выполняется из среды eclipse. Я внес следующие изменения в исполняемый файл вручную с терминала.

chown root:root change_gw //change the owner to root
chmod u+s change_gw //set user id

Теперь, когда я запускаю исполняемый файл из среды eclipse, я получаю следующий вывод.

euid = 0
uid = 1002
route changed successfully

Хотя приведенный выше код работает нормально, я хотел бы знать, что то, что я делаю, правильно и эффективно. И поскольку компиляция выполняется в среде eclipse, пользователь исполняемого файла каждый раз меняется с root на локального пользователя, и мне нужно каждый раз менять флаг setuserid. Как я мог избежать этого изменения каждый раз?


person Kumar    schedule 15.12.2015    source источник
comment
stackoverflow.com/ questions/22733967/ объясняет, как изменить таблицу маршрутов, не используя команду.   -  person Martin Bonner supports Monica    schedule 15.12.2015
comment
Вы хотите, чтобы любой мог добавить этот маршрут? Если нет, просто оставьте пользователя локальным пользователем, и тогда ему придется ввести свой пароль, чтобы изменить таблицу маршрутизации. Если вы действительно хотите, чтобы программа была setuid, вам нужно найти меры предосторожности, которые вы должны предпринять, если вы не хотите стать зияющей дырой в безопасности.   -  person Martin Bonner supports Monica    schedule 15.12.2015
comment
Заключительный комментарий: exec не принимает ни одной строки в качестве аргумента. Вы должны подготовить массив (модифицируемых) строк как argv.   -  person Martin Bonner supports Monica    schedule 15.12.2015


Ответы (1)


Вызов setreuid() не нужен. Бит suid в вашем исполняемом файле достаточен и делает то же самое. Этот вызов setreuid() здесь ничего не делает.

Вам может понадобиться или не понадобиться выполнять setgid() или setuid(), если есть что-то еще, что вам нужно сделать, что требует этого.

person Sam Varshavchik    schedule 15.12.2015