The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Bash экранированние"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Информационная безопасность (Безопасное программирование / Linux)
Изначальное сообщение [ Отслеживать ]

"Bash экранированние"  +/
Сообщение от LINUXORGRU (ok), 15-Мрт-24, 10:08 
Всем здравствуйте. Хочется критики, суть такая, есть lua (не хихикать) скрипт например который через io.popen() выполняет одни команды читая вывод и опять через io.popen() передаёт этот вывод как ввод другой команде, вроде всё просто.  Но хочется чтобы даже в теории не было так (из за бага/просто кривых рук/положения Венеры в созвездии стрельца) что ввод одной команды попав в popen() как есть не исполнился, чтобы данные были только данными и никак не обрабатывались оболочкой (не исполнялись команды, не обрабатывались спецсимволы оболочки).

Хорошо, тут вот  https://www.opennet.dev/docs/RUS/bash_scripting_guide/c1833.h...указано про экранирование в одинарные кавычки с учётом вложенных ежели таковые имеются. Теперь данные это просто данные и не происходит никакой магии, единственное что если эти данные например 'pwd' будут исполнены попав в оболочку, но подумалось что если добавить тупо пробел то что угодно типа 'rm ' уже ну никак не сможет быть исполнено так как оболочка будет искать в PATH как есть вместе с пробелом, но просто с ним ничего там не найдёт, это в теоооории, гарантирует что любая дрянь попавшая в шелл ничего не сделает.

Типа такого


function escape(text)
    return "'" .. text:gsub("'", "'\\''") .. " '" -- пробел в конце дабы сломать поиск в PATH
end

os.execute(escape("тут любая лютая дичь"))


Вопрос, бабабадумс, я дурак и что-то упускаю или всё хорошо?


Размашисто описал, но к примеру я беру через xclip случайные данные которые скопипастил из браузера и передаю их как параметр командной строки другой программе в оболочку предварительно пропустив через escape() что выше описан. И в теории вывод xclip может попасть в оболочку (sh/bash/dash/etc) как есть, но это нужно не допускать даже в теории.


Есть ли подвох?

P.S Да я знаю про пайпы просто шела


app1 | app2

Но, не все программы умеют читать из стандартного ввода, промежуточные данные могут быть как-то в середине модифицированы (для этого lua мне и нужна) вызовы через popen это просто взять данные в одном месте, обработать на lua, передать дальше. И вот про это "передать" я вот балакаю :)

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Bash экранированние"  +/
Сообщение от Аноним (-), 15-Мрт-24, 12:14 
>[оверквотинг удален]
> Есть ли подвох?
> P.S Да я знаю про пайпы просто шела
>
 
> app1 | app2
>

> Но, не все программы умеют читать из стандартного ввода, промежуточные данные могут
> быть как-то в середине модифицированы (для этого lua мне и нужна)
> вызовы через popen это просто взять данные в одном месте, обработать
> на lua, передать дальше. И вот про это "передать" я вот
> балакаю :)

юзай экспорт и энвирон, таблицу эскейпов я тебе не вспомню, сам хочу запилить экранизатор, в сторону printf %q посмотри еще

Ответить | Правка | Наверх | Cообщить модератору

2. "Bash экранированние"  +/
Сообщение от LINUXORGRU (ok), 15-Мрт-24, 12:59 
> юзай экспорт и энвирон

Из коробки в lua нет setenv только getenv, не ну можно через luajit FFI дёрнуть, но хочется любую луа без ограничений от 5.1 и до победного, короче без всяких особенностей.

Но, через переменные окружения конечно в целом тоже вариант, но мне больше в данный момент интересно является ли обрамление в (плюс экранирование внутренних) одинарные кавычки плюс пробел в конце (ну или в начале или и там и там не суть) достаточным, вроде по логике да.

1 - одинарные кавычки делают из строки реально просто строку и всё "как-есть" байтовый блоб
2 - пробел в конце гарантированно ломает попытку шелла исполнить такое 'ls ' так как таких исполняемых файлов не существует (если не создать специально) для надёжности можно так ' ls ' если данные нужны без них можно внутри принимающей программы просто по дефолту игнорировать первый и последний символы и всё (на это я могу пойти), больше важен именно интерфейс туда/сюда, простой и надёжный как тапка.

И всё, и вроде как все проблемы решены разом. Но вдруг и внезапно есть лазейка? Вроде как нет, но я засомневался и притопал, может кто комидорку кинет в меня и скажет "Ха смотри как можно, вот я тебя и похакал".

Ответить | Правка | Наверх | Cообщить модератору

3. "Bash экранированние"  +/
Сообщение от Hello (?), 15-Мрт-24, 13:43 
Строки конвертируй в hex.
Ответить | Правка | Наверх | Cообщить модератору

4. "Bash экранированние"  +/
Сообщение от Аноним (4), 16-Мрт-24, 21:10 
man xargs
Никогда не надо ничего дергать изнутри программы.
Ответить | Правка | Наверх | Cообщить модератору

5. "Bash экранированние"  +/
Сообщение от Neon (??), 14-Апр-24, 21:46 
> man xargs
> Никогда не надо ничего дергать изнутри программы.

Тогда не будет целого пласта программ. Которые внутри себя запускают другие программы

Ответить | Правка | Наверх | Cообщить модератору

6. "Bash экранированние"  +/
Сообщение от мявemail (?), 07-Окт-24, 13:33 
>[оверквотинг удален]
> Есть ли подвох?
> P.S Да я знаю про пайпы просто шела
>
 
> app1 | app2
>

> Но, не все программы умеют читать из стандартного ввода, промежуточные данные могут
> быть как-то в середине модифицированы (для этого lua мне и нужна)
> вызовы через popen это просто взять данные в одном месте, обработать
> на lua, передать дальше. И вот про это "передать" я вот
> балакаю :)

если башизмов не боитесь - printf "%q" 'ЧтоУгодно'

Ответить | Правка | Наверх | Cообщить модератору

7. "Bash экранированние"  +/
Сообщение от Аноним (7), 07-Окт-24, 14:12 
Хочу похихикать.

>через io.popen()

Родина дала им execl - на, пользуйся! Не хочу, хочу popen!
В следующий раз пользуйся тем, у чего есть execl/v()/spawnl/v(). Потому что кто-то (может, даже ты) обязательно не будет экранировать ввод и засунет в popen что не надо.

>есть ли подвох?
>text:gsub("'", "'\\''")

Частично есть. Никогда не обрабатывай на самом деле структурированные (массив, ага) строковые данные с помощью инструментов манипуляции строк. Все эти gsub, split и strip сразу на помойку, если это что-то сложнее базового CSV (и то для CSV в AWK придумали режим). Это что-то типа парсинга HTML регулярками.

В popen ты должен совать именно сджойненный массив экранированных слов. Экранируешь каждый аргумент, а не всю строку. И вот тогда, когда у тебя внутри escape будет целый аргумент как строка, можешь использовать gsub.

Короче, сделай себе на popen popenl, который будет принимать МАССИВ и его экранировать по отдельности и будет тебе счастье.

Ответить | Правка | Наверх | Cообщить модератору

8. "Bash экранированние"  +/
Сообщение от Аноним (7), 07-Окт-24, 14:17 
>пробел в конце

Тебе не нужен пробел в конце, если ты заэкранировал каждый аргумент и гарантированно контролируешь первое слово в команде. Лучше озаботься валидацией вот этого первого слова-команды.

Если ты вызываешь стандартные утилиты, которые понимают -- как запрет чтения флагов, выставляй -- перед данными.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру