Portál AbcLinuxu, 2. května 2025 17:13
Nový VIM verze 7 slibuje zajímavé funkce, mimo jiné code completion pro řadu jazyků včetně RUBY. Implementace code completion není v případě RUBY nic snadného, tak jsem byl zvědavý, jak si s tím autor VIMu poradil. Dnes jsem si to vyzkoušel vlastníma rukama a nevěřil jsem vlastním očím...
Out of the box mi code completion pro ruby nefungovava (byly v tom moje úpravy konfigurace pro VIM 6), tak jsem se jal číst dokumentaci... Uzel nápovědy "ft-ruby-omni" obsahuje text:
Notes: - Vim will load/evaluate code in order to provide completions. This may cause some code execution, which may be a concern.
Tahle věta nám vlastně říká, jak je code completion udělán -- oni ten kód VYKONÁVAJÍ. Chvíli jsem nevěřícně kulil oči "may be a concern" -- to je poněkud eufemisticky řečeno! Zavětřil jsem zásadní bezpečnostní problém.
Pak si říkám, že v RUBY jsou přece prostředky, jak se s takovou situací vyrovnat. No a pak jsem si to vyzkoušel... a málem jsem spadl ze židle: je to tak, použitím code completion ve VIMu si třeba můžete smazat disk.
Demonstrace:
Mějme zdrojový soubor a.rb:
system('echo vim je pako > /tmp/pako')
class MyTest
def test
return 1
end
end
Porom mějme zdrojový kód, který editujeme, třeba b.rb:
require 'a'
t = MyTest.new
t.t
Pokud nyní umístíte kursor na konec posledního řádku souboru b.rb a stiskněte CTRL-X-O (code completion), VIM vám korektně nabítne metodu "test". Jenže při tom také vytvoří soubor /tmp/pako s obsahem "vim je pako"...
Co k tomu dodat? Zneužití se přímo nabízí, nemluvě o tom, že ke škodě může dojít i omylem.
Někdy je méně více...
Tiskni
Sdílej:
require "my-evil-script.rb"
, vim se přepne do ruby-mode, a v site-packages se objeví váš zákeřný exploit, aby jej vim mohl spustit?
system("echo #{$:.inspect} >> /tmp/zde_je_pako")
.
3. krok (pokud vám to ani teď nedocvaklo) - zamyslete se nad tím, jestli je třeba možné, že by někdo pustil VIM z adresáře /tmp/.
4. krok a) pokud vám to už docvaklo, nasypte si popel na hlavu a příště před psaním ironického příspěvku přemýšlejte, b) pokud se cvaknutí stále nedostavilo, změňte povolání
"."
, je to jistý bezpečnostní nedostatek, ovšem pro Ruby, ne pro Vim.
2) Pusťte si Bash. Pod rootem napište echo >/etc/povolny_je_pako
, a stiskněte ENTER (ta velká klávesa napravo se zalomenou šipkou). Ha! bash je děravý.
3) To samozřejmě možné je, ale netuším co tím chcete dokázat.
4) Myslím že vaše rady nebudu brát příliš vážně.
1) pokud má Ruby jako prioritní search path pro moduly "."
, je to jistý bezpečnostní nedostatek, ovšem pro Ruby, ne pro Vim.
Jako prioritní ne, ale v serch path '.' má a to stačí. A problém VIMu to je, protože mluvíme o variantě, kdy je VIM linkován s Ruby a VIM nevhodným způsobem Ruby používá (nenastavuje $SAFE).
2) Pusťte si Bash. Pod rootem napište echo >/etc/povolny_je_pako
, a stiskněte ENTER (ta velká klávesa napravo se zalomenou šipkou). Ha! bash je děravý.
No to je dost mizerný vtip a ještě horší přirovnání.
3) To samozřejmě možné je, ale netuším co tím chcete dokázat.Třeba to, že exploit zranitelnosti, kterou jsem popsal je poměrně proveditelný.
negado
expanduje na most-negative-double-float
, wiof
na with-open-file
...prostě expanduje podle procenta fuzzy matche dost vychytaným způsobem... oumeme
+ TAB samo vyhodilo OutOfMemoryException (OutOfMemoryError) a nemuseli se se vším tak psát, zvlášť, když z toho dělají proměnnou a musejí to psát dvakrát. if ($a == ($b ± autobus)) { ... }hmm, a to sa jeden čuduje, prečo im ten vývoj trvá tak dlho
:wq!
, ZZ
nebo qq
. Ani Emacs se tomu nevyhnul. Vim je zato z nějakého důvodu imunní. ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.