Из man system: == Do not use system() from a program with suid or sgid privileges, because strange values for some environment variables might be used to subvert system integrity. Use the exec(3) family of functions instead, but not execlp(3) or execvp(3). system() will not, in fact, work prop- erly from programs with suid or sgid privileges on systems on which /bin/sh is bash version 2, since bash 2 drops privileges on startup. (Debian uses a modified bash which does not do this when invoked as sh.) == Из за этой милой шалости авторов bash не работает, например, игра crawl [dungeoncrawl.org]. Она setgidная, свои сейвы кладет в общий /var/games/crawl. Однако, она вызывает внешний /usr/bin/zip для их запаковки, который в процессе system() теряет setgid и, соответственно, всякую возможность к записи получившегося сейва в /var/games/crawl. Я полагаю, что надо сделать, как в Debian. Actual Results:
А как оно в дебиане сделано?
I disagree. If you need to keep effective [ug]id, consider using -p option.
Я не знаю, как оно точно сделано в дебиане, но (Debian uses a modified bash which does not do this when invoked as sh.) То есть, они это дело запатчили. >If you need to keep effective [ug]id, consider using -p option. If you need to think, consider using brains. If you use system(), you can't pass -p to /bin/sh because you don't have handler. And you can't use exec*() because of system() because you need to have patterns globbed, for example, and basically you just want to invoke string as a whole without half-assely tokenizing it yourself. Короче - мне пофиг, я всех уведомил, но пакет crawl, с учетом этого, собрать не-воз-мож-но. А в debian он давно есть, и все довольны. P.S. Уж не говоря, что bash _ДОЛЖЕН_ подразумевать --posix, когда запускается, как /bin/sh.
s/because of/instead of/ s/handler/handler to do so/
Во первых, если вы рассчитываете на конструктивный результат (а иначе зачем использовать bugzilla), то вам следует формулировать свою точку зрения более корректно. Во вторых, подход, который был избран в Debian, я уже рассматривал ранее и отверг как снижающий безопасность применения bash в этих условиях и таким образом просто неприемлемый. Самое главное, и это написано в system(3), использовать system(3) в привилегированном приложении небезопасно. Если некий пакет в Debian позволяет себе подобную вольность, следует поставить в известность мантейнера этого пакета. и автора потенциально уязвимой программы И наконец, /bin/sh это отнюдь не bash --posix, поэтому ничего он не должен. P.S. Эту bugzilla иногда использут разработчики, не владеющие русским языком. В случае, когда сообщение об ошибке или комментарий потенциально может привлечь их внимание, следует использовать язык общения разработчиков разных стран (английский).
Debian still has package named "crawl", that is, definitely, set-gid game that uses system() to spawn tar process for savefiles compression. It have security fixes done for it, so I assume it is monitored properly, and set-gid system() does not bugs them. But you may try to report that bug and I'll see what they'll tell you. /bin/sh should conform to POSIX, otherwise it's such a sucky /bin/sh. Foreign developers should take note of "Аффтар, учи албанский!"
Why doesn't crawl make use of zlib/bzlib?
I think that's because noone taught it to do so. And anyway, it have got a lot of files to compress, not a single one. So you'll propose to build tar into game binary? It simply used unix-way - evoke process to do work for it. In this case this did not work. Life sucks and then you die, you know it.