Forum » Programiranje » [MariaDB] Brez insert pravice možen insert preko procedure...
[MariaDB] Brez insert pravice možen insert preko procedure...
HotBurek ::
Dober večer.
Danes sem nalete na nenavadno obnašanje MariaDB 10.11.1 serverja, kar se gre pravic.
Uporabnik user_1 ima na bazi database_1:
- GRANT EXECUTE ON pravico na nivoju baze (to je za poganjat procedure)
- ter GRANT SELECT, INSERT, UPDATE ON na tabeli table_1
Na tej bazi pa obstaja tudi tabela table_2, ter procedura, ki izvede INSERT v tabelo table_2.
In sedaj, če z uporabnikom user_1 poženem INSERT INTO table_2..., dobi 'command denied', kar je normalno, ker na tej tabeli nima teh pravic.
A če s tem istim uporabnikom požene proceduro CALL `database_1`.`table_2_insert` (...);, v kateri je ta isti insert ukaz, pa gre zadeva skozi in vnese podatke.
Testiral sem tako, da sem se v terminalu privajil s tem userjem (mysql -u user_1 -p). Pa 3x preveril, da nisem root al pa kaj takega.
Kolikor se spomnim, "včasih" to, da si proceduro uporabil kot proxy in je šlo vse skos, tudi če nisi imel pravic na tabeli, ni delalo. Sedaj pa dela. Weird.
-----------------------------------
UPDATE 1
Primer iz MSSQL: https://sqlnuggets.com/stored-procedure...
UPDATE 2
Rešitev: SQL SECURITY INVOKER
Docs:
https://mariadb.com/kb/en/stored-routin...
https://kedar.nitty-witty.com/blog/acce...
Solid.
Danes sem nalete na nenavadno obnašanje MariaDB 10.11.1 serverja, kar se gre pravic.
Uporabnik user_1 ima na bazi database_1:
- GRANT EXECUTE ON pravico na nivoju baze (to je za poganjat procedure)
- ter GRANT SELECT, INSERT, UPDATE ON na tabeli table_1
Na tej bazi pa obstaja tudi tabela table_2, ter procedura, ki izvede INSERT v tabelo table_2.
In sedaj, če z uporabnikom user_1 poženem INSERT INTO table_2..., dobi 'command denied', kar je normalno, ker na tej tabeli nima teh pravic.
A če s tem istim uporabnikom požene proceduro CALL `database_1`.`table_2_insert` (...);, v kateri je ta isti insert ukaz, pa gre zadeva skozi in vnese podatke.
Testiral sem tako, da sem se v terminalu privajil s tem userjem (mysql -u user_1 -p). Pa 3x preveril, da nisem root al pa kaj takega.
Kolikor se spomnim, "včasih" to, da si proceduro uporabil kot proxy in je šlo vse skos, tudi če nisi imel pravic na tabeli, ni delalo. Sedaj pa dela. Weird.
-----------------------------------
UPDATE 1
Primer iz MSSQL: https://sqlnuggets.com/stored-procedure...
UPDATE 2
Rešitev: SQL SECURITY INVOKER
Docs:
https://mariadb.com/kb/en/stored-routin...
https://kedar.nitty-witty.com/blog/acce...
Solid.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
- spremenilo: HotBurek ()
jernejl ::
Če je procedura od drugega userja in ima tisti user ustrezen grant, potem to tako deluje. Sicer si pa že sam ugotovil.
To pride prav, če želiš uporabnikom omejiti dostop do tabele, recimo onemogočiti, da bi notri vnašali karkoli, in poskrbeti, da se hkrati mogoče posodobijo še odvisne tabele.
Recimo procedura za vstavljanje nove osebe v bazo (psevdokod):
Tole je recimo bolje, kot da vsaki aplikaciji (ki mora vstavljati osebe v bazo) oziroma njihovim programerjem daš prost dostop do vseh teh tabel in naj sami vnesejo vse tako, da bo prav. Ker je samo vprašanje časa, kdaj se bo našel en "študent", ki se mu ne bo dalo programirati vseh mogočih "checkov" in boš potem imel v bazi osebe, ki jim je ime "XYZ123", živijo v ulici "DELETE FROM TABELA WHERE 1=1" in so se rodile 1.1.2111.
To pride prav, če želiš uporabnikom omejiti dostop do tabele, recimo onemogočiti, da bi notri vnašali karkoli, in poskrbeti, da se hkrati mogoče posodobijo še odvisne tabele.
Recimo procedura za vstavljanje nove osebe v bazo (psevdokod):
procedure vstavi_osebo(ime, priimek, datum_rojstva, spol, ulica, postna_st, posta) begin preveri_datum(datum_rojstva) --ali je v smiselnem intervalu preveri_ime(ime) --ali nima kakih nenavadnih znakov if "ne obstaja ulica v tabeli ulica" then insert into ulica... end if; if "ne obstaja pošta v tabeli posta" then insert into posta... end if insert into oseba ... end
Tole je recimo bolje, kot da vsaki aplikaciji (ki mora vstavljati osebe v bazo) oziroma njihovim programerjem daš prost dostop do vseh teh tabel in naj sami vnesejo vse tako, da bo prav. Ker je samo vprašanje časa, kdaj se bo našel en "študent", ki se mu ne bo dalo programirati vseh mogočih "checkov" in boš potem imel v bazi osebe, ki jim je ime "XYZ123", živijo v ulici "DELETE FROM TABELA WHERE 1=1" in so se rodile 1.1.2111.
Zgodovina sprememb…
- spremenil: jernejl ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Mariadb (InnoDB) istočasni insert v tabelo iz različnih procesov (strani: 1 2 )Oddelek: Programiranje | 7267 (3625) | 2g00d4u |
» | C# INSERT statment ne vpise podatkovOddelek: Programiranje | 1202 (1076) | darkolord |
» | mysql, insert, values, selectOddelek: Programiranje | 1811 (1638) | slosi |
» | [SQL] InsertOddelek: Programiranje | 2068 (1670) | greentech |
» | [T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?Oddelek: Programiranje | 2887 (2605) | dmok |