Keyfi bir dosyaya ulaşmak ne kadar güvenli?


77

Bazen catyanlışlıkla bir ikili dosya kullandığımda terminalim bozuluyor. Hızlı bir şey resetdüzeltemez, ancak saldırgan teorik olarak bir terminalde görüntülendiğinde bazı rasgele kodlar yürütecek bir dosya oluşturamaz mı? Terminal emülatöründeki bir kullanım veya başka şekilde.


3
Bazen bunu yaptığımda kabuğum sonunda "<garbage> unknown command" diyebilir. Bu gerçekten mümkün olup olmadığını merak ediyor.
Keith

5
Terminal emülatörü için istismarlar vardı, örneğin linuxsecurity.com/content/view/104657 veya securityfocus.com/bid/6936/discuss, bu nedenle özel bir güvenlik
önlemi

1
Bu nedenle , dosyaların içeriğini incelemek için ikili dosyalarda (gibi more) yavaşlayan veya terminalde farkında olan bir şey kullanmak daha iyidir less. Sadece terminalinizi garip bir duruma getirmekle kalmaz, tüm dosya tek seferde uçmaz.
Blrfl

stty saneKomut farklı bir karakter kümesi içine, örneğin açık olan bir xterm (veya benzeri) sıfırlar.
Thorbjørn Ravn Andersen

moshbelgeler üzerinde bazı düşünceler var: mosh.mit.edu/#techinfo
Max Ried

Yanıtlar:


34

Bu tür bir çıkışın kullanılıp kullanılmayacağı terminal programına ve gönderilen terminalin kaçış koduna bağlı olarak ne yaptığına bağlıdır. Bu tür istismar edilebilir özelliklere sahip olan terminal programlarının farkında değilim ve şu andaki tek sorun, bilinmeyen bir tampon taşması veya bundan faydalanabilecek bir şey varsa olacaktır.

Bazı eski hardwareterminallerde, bu, örneğin bu tür kaçış dizileriyle fonksiyon tuşlarını, donanımdaki o tuş için bir komut dizisini kaydederek programladığınız bir problem olabilir. Bunu etkinleştirmek için hala fiziksel bir tuşa basmanız gerekir.

Ancak, her zaman (Hauke ​​gibi çok belirgin şekilde 'braindead' olarak işaretlenir), yarattığı boşlukları anlamayan, onlar için bir problemi çözerse böyle bir özellik eklemek isteyen insanlar vardır. Açık kaynaklı yazılım konusundaki deneyimime göre, koda bakan birçok göz nedeniyle, bunun kapalı kaynakta olduğu gibi olma olasılığı daha düşük. (Silikon Grahpics 'Irix'teki posta programında, on dokuzların ortalarında, alıcı makinede çalıştırılacak komutları, çalıştırılabilirlere gerçek yollar ekleyebileceğinizi hatırlıyorum.)


3
"Alıcı makinede çalıştırılacak komutları dahil edebilirsiniz" Windows Scripting Host'a çağıran bir VBScript e-postasına dahil olmak gibi bir şey mi demek istiyorsunuz? :)
CVn

Hayır, tam olarak, bir ses çalmak gibi makinede bulunan bir çalıştırmayı başlatabilirsiniz. Kesin sözdizimini (yaklaşık 20 yıl önce) hatırlamıyorum ya da bu 'özelliği' bir kurulumda kapatıp açamayacağınızı hatırlamıyorum. Ağımızda kayıtlı otomatik olarak oynatılan videolarla biraz eğlendik.
Anthon

NeWS hakkında konuşmuyorsun değil mi? IIRC SGI son seçenekten biriydi.
luser droog,

@ luserdroog Hayır, Irix
Anthon

1
@Anthon Hala mümkün olup olmadığından emin değilim, ancak writekomuttan gelen metni "tekrarlamak" için bir uçbirim elde etmek için çıkış kodlarını kullanma olasılığı - bu nedenle uçbirime sahip olan kullanıcı olarak komutları / komut dosyalarını çalıştırma. Güya, mesg -nçoğu zaman kullanıcılar için ve root her zaman için mesajların kapatılmasını tavsiye etmenin nedeni bu . AFAIK, bu gerçekten yapıldı - hiç kullanılıp kullanılmadığını bilmiyorum. Yani bir rasgele metin catted yürütülebilir, olabilir belki yürütülecek.
Baard Kopperud

33

Çoğu terminal emülatörleri, belirli kaçış dizileri alırlarsa ( xterm kontrol dizileri belgelerine bakın ) bir yanıt gönderir . Örneğin, \e[0cVT100 benzeri bir emülatöre gönderebilirsiniz ve cihaz özelliklerini geri gönderir, şöyle bir şey \e[?1;2c (Bu muhtemelen Keith'in gözlemlediği şeydir). Yine de, 2csisteminizde ölümcül bir şey yapan bir yere ait bir yürütülebilir dosya bulunması kötü bir fikirdir.

Güncelleme: Riskler, bir xterm penceresinin başlığını ayarlama ve uygun kaçış dizileri kullanarak başlığı geri gönderme olasılığı nedeniyle (düşündüğümden daha büyük ) ( http://www.securityfocus.com/bid/6940/ ) . Yukarıdaki örneğin aksine, başlık neredeyse rastgele bir dize olabilir.


Bu zaten çok yakın kesiyor.
Gunchars

Daha eski bir özellik var - ENQ (Ce) karakterine cevaben gönderilen 'cevap mesajı'. Gerçek bir VT100'de, terminal tarafından KURULUM menüsünde kullanıcı tarafından ayarlanır; belki uzaktan ayarlamaya izin veren terminal emülatörleri var ...
sendmoreinfo

16

Bu, PS1 gibi bir şey tarafından geçersiz kılmadıkça, GNOME Terminal 3.6.1'deki terminal başlığını değiştirir :

printf "\033]2;Script Kiddie was here\007"

Şimdi catsürümü test etmek için yeni bir GNOME Terminal penceresi açın :

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

Evet, bu aynı zamanda terminal başlığını da belirler.

Başlığın komut satırına basılmasıyla sonuçlanan bir kaçış koduyla ilgili bir güvenlik sorunu vardı , bu nedenle etkin bir şekilde dosya oluşturabilirsiniz cat(ed ne zaman yazdırılır? keyfi komutlar. Ah!


8

Kullanmak catkod yürütmeyle sonuçlanmasa da, kaçış kodları işlenir, böylece aslında kötü niyetli olduğunda komut dosyasının zararsız olduğunu düşünerek kolayca yanlış yönlendirilebilirsiniz.

İşte çalıştırabileceğiniz ve "kötü amaçlı" bir kabuk betiği yaratacak bir örnek komut:

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

Dosyayı incelediğinizde, yeterince zararsız görünüyor:

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

Ama gerçekten çalıştırmalısın ...

$ ./demo.sh 
...doing something bad here...

Komut, imleci birkaç satır yukarı taşımak için ham kaçış kodları dahil ederek çalışır, bu nedenle komut dosyasının geri kalanı kötü amaçlı kodun üzerine yazılarak gizlenir.

Neredeyse başka bir program ne olduğu için senaryoyu ortaya çıkaracaktır. (Gibi dosya içeriğini işlemek yok Sadece programlar cat, moreve less -r) yanıltıcı çıktı üretecektir.

Not tailve headaynı yanıltıcı çıktıyı üretirler. Bu nedenle "daha az + F" kullanmak "tail -f" den daha güvenlidir.


Bu oldukça sorunlu ... Çalıştırarak gerçekte neler olup bittiğini görebilirsiniz echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Not: --color=yesburada "kötü niyetli" kodun ne olduğunu gösterir) veya yerleşik cat -v demo.sh.
Charlie,

Doğru veya yanlış, farklı bir sorunun cevabı: catdosyanın içeriğini göstermede ne kadar güvenilir olduğu .
Incnis Mrsi 17:15

@IncnisMrsi: Farklı bir sorunun cevabı değil. Bu cevap, kedinin kaçış kodları göstereceği konusunda uyarır ve yalnızca bir kaçış kodu türüyle basit bir örnek sunar, ancak daha birçokları vardır. Bazı terminallerle birleştirildiğinde, bunlar tuşları yeniden boyutlandırabilir, dosyaların üzerine yazabilir ve teoride hatta komutları çalıştırabilir . Bu yüzden kaçış kodlarını gösterme tehlikesinin farkına vardığınızda cat, soruların sorulduğu gibi, bazen keyfi bir dosyaya güvensiz olabileceğini anlayacaksınız !
Malvineous

6

Kesinlikle xtermyazmışım gibi kendi içine rasgele karakterler eklemeyi deneyimledim . Ve zaman zaman bu görünüşte newline karakterini içeriyor, bu yüzden ngwerm:0riu: command not foundbir cevap olarak aldım . Birisinin, belirli, zararlı komutlar gönderecek bir dosya hazırlayamamasının bir nedeni olmadığını görüyorum. Yani evet, en azından bazı terminaller keyfi etkisi olan saldırılara karşı hassastır.


2

Eh, bir terminal emülatörü basitçe kendisine gönderilen karakterleri yazdırır.

Mevcut pozisyona bir karakter basmanın yanı sıra, yeni bir pozisyon belirleme, renk değiştirme, başlık değiştirme vb. Gibi her şey kaçış dizileri ile yapılır.

Desteklenen kaçış dizileri genellikle, diğer işlemlere başlamanın bir yolunu tanımlamayan ANSI gibi iyi tanımlanmış standartlardan oluşur . Bu tür bir diziyi uygulamak mümkün olsa da, kasıtlı olarak bu tür şeylere izin veren herhangi bir terminal emülatörünün farkında değilim.

Teoride, keyfi işlevselliği tetiklemek için tampon taşması gibi bir hata kullanılabilir. Ancak bu, hemen hemen başka herhangi bir ikili sistemde mümkün olacaktır.


0

Genelde, keyfi bir dosyayı yakalama riski yoktur. Bir dosyayı analiz etmek için her zamanki yöntemim aşağıdakileri yapmaktır:

$ file <mystery file>
$ strings <mystery file> | less

Yukarıdaki filekomut , bir dosyanın türünü komut aracılığıyla belirlememe izin verir ve stringskomut, tanımlanabilecek herhangi bir dizgiyi, soylarından emin olamadığım ikili dosyalardan atmamı sağlar.

örnek

dosya çıktısı
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
dizeleri çıktı
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...

3
dizeleri bilinmeyen bir dosyada çalıştırmak da sorunlu sonuçlar doğurabilir. lcamtuf.blogspot.fi/2014/10/…
Jan Wikholm

@IncnisMrsi - ilk cümleyi okuyun !!!!
slm

Tamam, önceki ifademe geri dönersek, cevap kısa, kafa karıştırıcı terminoloji kullanarak, temelsiz ve açıkça eksik. Güvenlikte, “keyfi” favorite favori işletim sisteminizde dağıtıldığı gibi rastgele olduğuna dikkat edin.
Incnis Mrsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.