LINUX.ORG.RU

История изменений

Исправление shdown, (текущая версия) :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием есть в любом языке, где есть строки (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'"$0" "$@"', 'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'"$0" "$@"', 'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

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

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

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

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

Исправление shdown, :

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

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

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечно, что исполнит произвольный код на питоне.

Исходная версия shdown, :

[qote] изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

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

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечно, что исполнит произвольный код на питоне.