Portál AbcLinuxu, 16. července 2025 03:07


Dotaz: ioperm c++

15.5.2012 07:43 ubka7617
ioperm c++
Přečteno: 285×
Odpovědět | Admin

Dobry den. mam program v cecku ktory povoluje pristup na hardware pod rootom cez ioperm,

potom cet setgid a setuid nastavim procesu aby bezal pod non-root uzivatelom

execvp( argv[1], &argv[1] ); cez toto pustim program

Problem je v tom ze ked pustim program priamo ako uzivatel tak mi funguje do doby kym nemusi pristupovat na hardware pc, potom padne.

Ked ten program pustim cez toto tak mi nedokaze logovat vypise mi permision denied aj ked bezi pod rovnakymi pravami ako ked by bol spusteni priamo ako uzivatel.

Neviete mi niekdo poradit ?

if ( ioperm(0x160, 1, 1)) {
cout << "Neuspesne nastavenie prav" << endl;
return 1;
}

if( ( pwd = getpwnam( "user" ) ) == NULL ) {                // citanie uid meno shell a podobne o uzivatelovi
printf( "Chyba pri citani udajov u uzivatelovi! \n" );

return 1;
}

uid = pwd->pw_uid;
gid = pwd->pw_gid;

setgid(gid);

setuid(uid);

execvp( argv[1], &argv[1] );

Dakujem

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

pavlix avatar 15.5.2012 09:11 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: ioperm c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
ioperm() sets the port access permission bits for the calling process for num bytes starting from port address from to the value turn_on. If turn_on is nonzero, the calling process must be privileged (CAP_SYS_RAWIO).
http://www.kernel.org/doc/man-pages/online/pages/man2/ioperm.2.html

Možná jsem špatně pochopil tvůj popis problému, ale bohužel je příliš zmatený a vágní. Ale tady se píše, že ti to fungovat ani z definice nemůže.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
15.5.2012 09:35 ubka7617
Rozbalit Rozbalit vše Re: ioperm c++

tak ono to funguje ale program ktory je v execvp sa pusti s neakymi inymi pravami aj ked ps -Af ukazuje ze bei pod definovanym uzivatelom.

15.5.2012 09:45 ubka7617
Rozbalit Rozbalit vše Re: ioperm c++

execvp( argv[1], &argv[1] ); cez toto pustim program - myslene dalsi program ktory komunikuje priamo s HW co bez predchydzajuceho ioperm nefunguje.

Pustim program ktroy mam v cecku a z neho po nastaveni prav a prislusneho uid a gid spustim dalsi program ktory uz bezi dalej.

pavlix avatar 15.5.2012 17:04 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: ioperm c++
Vůbec nerozumím, co se tím snažíš vyjádřit.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
15.5.2012 10:01 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: ioperm c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, nepotrebuje ten volany proces nejake promenne prostredi? To byva asi nejcastejsi problem pri pouziti setuid a execve. Pokud to spoustis pod rootem tak ma promene prostredi roota. Pokud ten druhy prakaz pustis z terminalu primo pod uzivatelem user pak ma jeho promene prostredi.
Dale me napada, jestli nepotrebuje ten druhy program nejake parametry (v prikladu se nic nepredava).

Moznost jak najit co selhalo je asi nejlepsi pres strace - ten primo ukaze syscally s navratovou hodnotou a bude vided co vratilo chybu.
15.5.2012 13:14 ubka7617
Rozbalit Rozbalit vše Re: ioperm c++

ten druhy program berie paramtere z parametrov toho prveho pri spusteni argv[1], &argv[1]

15.5.2012 16:09 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: ioperm c++
A jo, nekam jsem jspatne precetl execvp - takze tim odpada jedna moznost.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.