deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Shell PATH girdilerinde tırnak içine alınmış tilde, $HOME/bin yerine sessizce literal bir ~ dizini ekler

export PATH satırlarında tırnak içine alınmış bir tilde asla ev dizininize genişlemez; PATH'inize, yazılabilir dizinlerin suistimal edebileceği göreli bir ./~ girdisi bırakır — bir agent sandbox'ının uyarısının ortaya çıkardığı gibi.

Shell PATH girdilerinde tırnak içine alınmış tilde, $HOME/bin yerine sessizce literal bir ~ dizini ekler

disconnect3d.pl'de yayınlanan ve Hacker News ana sayfasına taşınan bir yazı, shell yapılandırma dosyalarındaki en yaygın satırlardan birinin, yazarının niyetinden bambaşka bir şey yaptığına dikkat çekiyor. .bashrc veya .zshrc dosyasına export PATH="$PATH:~/.local/bin/" yazmak, ev dizininizdeki yerel bin klasörünü komut arama yoluna eklemez. Bunun yerine, literal bir tilde karakteri içeren bir girdi ekler — shell'in bulunduğu hangi dizine göre çözümlenen göreli bir yol.

Yazar, AI agent'ları için bir sandboxing aracı olan nono ile denemeler yaparken bu sorunla karşılaştı. Araç, PATH içinde bir girdinin sandbox'tan yazılabilir olduğu konusunda uyardı ve işaretlediği girdi ~/.local/bin/ idi; bir sandbox kullanıcının ev dizinine yazamayacağı için bu şüpheli görünüyordu.

Tilde neden hayatta kalıyor

Suçlu tırnak kullanımı. Yazıda alıntılanan Bash belgelerine göre, tilde genişletmesi yalnızca bir sözcüğün başında tırnak içine alınmamış bir tilde bulunduğunda uygulanır; ayrıca Bash, değişken atamalarında = veya : karakterini hemen izleyen tırnaksız tildeleri de genişletir. Çift tırnak içindeyse tilde sıradan bir karakterdir.

Sonuç, ~/.local/bin/ biçiminde yazılmış bir PATH girdisidir. Eğik çizgiyle başlamadığı için shell bunu göreli kabul eder — fiilen ./~/.local/bin/ olarak — ve bir komut arandığında mevcut çalışma dizinine göre çözer.

Kısa bir gösterim

Durumu kanıtlamak için yazar, boş bir çalışma dizini içinde kelimenin tam anlamıyla ~/.local/bin adında bir dizin ağacı oluşturdu, içine kek adında küçük bir C programı derledi ve PATH="~/.local/bin/" kek olarak çağırdı. Program çalıştı ve selamlamasını yazdırdı; literal tilde dizini içinde bulundu, kullanıcının ev dizininin aramayla hiçbir ilgisi yoktu.

Nasıl kontrol edilir ve düzeltilir

Hızlı bir test:

sh echo "$PATH" | tr ':' '\n' | grep '~'

Herhangi bir çıktı, yanlış yapılandırmanın mevcut olduğu anlamına gelir. Çözüm, .bashrc, .zshrc veya .profile dosyasını açıp tildeyi $HOME ile değiştirmektir:

sh export PATH="$PATH:$HOME/.local/bin/"

Yazar, tırnaksız biçimin yani export PATH=$PATH:~/.local/bin'in hem Bash hem de Zsh'de doğru genişlediğini belirtiyor; çünkü bu shell'ler atamalarda = ve her : karakterinden sonra tilde genişletmesi yapar. Yine de bunu kırılgan olarak nitelendiriyor — değerdeki herhangi bir boşluk atamayı bozar — ve güvenilir seçenek olarak tırnak içine alınmış $HOME biçimini öneriyor.

Ayrıca sorunu ilk ortaya çıkardığı için nono'ya teşekkür ediyor; ancak uyarısının sorunu daha net açıklayabileceğini belirtiyor ve mesajı iyileştirmek için bir pull request'in yolda olduğunu yazıyor.

Neden önemli

~/.local/bin'i PATH'e eklemek standart bir tavsiyedir; insanlar pip --user veya diğer kullanıcı başına araçları kurarken her yerde tekrarlanır, dolayısıyla tırnaklı tilde varyantı büyük olasılıkla birçok dotfile'da yaşıyor. Hata tamamen sessizdir: shell asla hata vermez ve hedeflenen dizin basitçe hiç aranmaz.

Güvenlik sonucuysa bunu kozmetik bir hatanın ötesine taşıyan şeydir. Göreli bir PATH girdisi, her yazılabilir dizini potansiyel bir komut enjeksiyon noktasına dönüştürür. İçinde .local/bin alt ağacıyla birlikte ~ adında bir klasör oluşturabilen her şey — bir proje dizinine yazma erişimi olan bir AI kodlama agent'ı, klonlanmış bir depo veya paylaşımlı yazılabilir bir konum — PATH'te daha önce bulunamayan her komutta shell'in çalıştıracağı çalıştırılabilir dosyalar yerleştirebilir. Girdi sona değil başa eklenmiş olsaydı, gerçek sistem komutlarını tamamen gölgeleyecekti. Nono gibi sandboxing araçları bunu, PATH girdilerini sandbox'ın yazabildiği konumlarla karşılaştırarak yakalar; olay da tam olarak böylece ortaya çıktı.

Genel ders şudur: tilde genişletmesi, tırnaksız shell girdisinin bir kolaylığıdır, değişkenlerin bir özelliği değil. Tırnak içinde her zaman $HOME kullanın.

  • #shell
  • #bash
  • #zsh
  • #security
  • #path

İlgili yazılar