Univention Bugzilla – Bug 18443
Fehlendes Escaping für eval "$(ucr shell)"
Last modified: 2012-12-12 21:09:18 CET
In vielen Skripten wird nur eval $(ucr shell) statt eval "$(ucr shell)" verwendet. Dies führt dazu, daß nach der Expansion von "ucr shell" die Variablenzuweisungen nochmals durch die Shell expandiert werden. Das folgende Beispiel zeigt das Problem: # echo * sources.list # ucr set test="* * *" Create test # ucr shell test test="* * *" # eval $(ucr shell test) # echo "$test" * sources.list * # eval "$(ucr shell test)" # echo "$test" * * * Das ist insbesondere UCR-Variablen mit Shell-Metazeichen kritisch: # ucr search --brief --value '[*?$`]' ldap/connection/check: */3 * * * * ldap/policy/cron: 5 * * * * mrtg/cron: */15 * * * * Siehe Bug #8417 Comment 7 für weitere Informationen. Ggf. ist Bug #17269 auch auf diese Problematik zurückzuführen. Alle Skripte sollten korrigiert werden und ggf. ein ucs-test-Test oder ucs-lint-Check eingebaut werden, der fehlerhaften Verwendung anprangert.
Derzeit werden 801 Fälle gefunden von: $ find \( -name .git -o -name .svn -o -name .pc -o -name .metadata \) -prune -o -type f -exec grep -E -l 'eval[[:space:]]+(\$\(|`)(/usr/sbin/)?(ucr|univention-config-registry|univention-baseconfig)[[:space:]]+.*shell.*[)`]' {} + | wc -l
*** Bug 23985 has been marked as a duplicate of this bug. ***
Gibt es dazu eine ucslint Prüfung?
Jein. ucslint prüft derzeit nur im postinst (0006-7) und in Joinskripten (0001-10) auf folgende Konstrukte: eval $(ucr shell) eval `ucr shell` aber nicht auf eval $(ucr shell FOOBAR) eval `ucr shell FOOBAR`
Wir sollten zu 3.1 die uclint Prüfung implementieren und dann die Pakete entsprechend anpassen.
Ein Teil ist in svn28113 geschehen.
Ich konnte nurnoch einen weiteren Aufruf von eval $(ucr shell) ohne quotes finden (in univention-samba/addmachine.sh) - den habe ich korrigiert. Darüber hinaus habe ich ucslint wie gewünscht um einen Test erweitert, der alle Dateien eines Pakets auf eval $(ucr shell) Aufrufe ohne quotes prüft. Die Prüfung aus dem Test des postinst fällt dafür weg. univention-samba (7.0.1-10) unstable; urgency=low * added quotes to eval $(ucr shell) call in addmachine.sh (Bug #18443) rev34506 ucslint (3.0.1-1) unstable; urgency=low * added a test for unquoted calls of eval $(ucr shell) * removed testing for unquoted calls of eval $(ucr shell) from 0006 and 0001 (Bug #18443) rev34505
Bezüglich svn34505: ucslint/0001-CheckJoinScript.py - ... '0001-10': ... 'join script contains "eval $(ucr shell)" without proper quoting' ], - ... '0001-11': ... 'join script contains lines with unquoted $@' ], - ... '0001-12': ... 'join script contains more than one line with VERSION= statement' ], - ... '0001-13': ... 'join script does not include "joinscripthelper.lib"' ], - ... '0001-14': ... 'join script does not call "joinscript_init"' ], - ... '0001-15': ... 'join script does not call "joinscript_save_current_version"' ], + ... '0001-10': ... 'join script contains lines with unquoted $@' ], + ... '0001-11': ... 'join script contains more than one line with VERSION= statement' ], + ... '0001-12': ... 'join script does not include "joinscripthelper.lib"' ], + ... '0001-13': ... 'join script does not call "joinscript_init"' ], + ... '0001-14': ... 'join script does not call "joinscript_save_current_version"' ], Die IDs müssen stabil bleiben und dürfen NICHT neu durchnummeriert werden, weil diese auch in den ganzen debian/ucslint.overrides Dateien verwendet werden. Bitte zumindest das Rückgängig machen und 0001-10 irgendwie als "Unused, moved to 0017-*" markieren. ucslint/0017-Shell.py + for root, dirs, files in os.walk('.'): Hier bitte den FilteredDirWalkGenerator() aus ucslint/base.py benutzen, weil der korrekt mit den ganzen Dateien umgeht, die ignoriert werden sollen.
(In reply to comment #8) > Bezüglich svn34505: > > ucslint/0001-CheckJoinScript.py > - ... '0001-10': ... 'join script contains "eval $(ucr shell)" without proper > quoting' ], > - ... '0001-11': ... 'join script contains lines with unquoted $@' ], > - ... '0001-12': ... 'join script contains more than one line with VERSION= > statement' ], > - ... '0001-13': ... 'join script does not include "joinscripthelper.lib"' ], > - ... '0001-14': ... 'join script does not call "joinscript_init"' ], > - ... '0001-15': ... 'join script does not call > "joinscript_save_current_version"' ], > + ... '0001-10': ... 'join script contains lines with unquoted $@' ], > + ... '0001-11': ... 'join script contains more than one line with VERSION= > statement' ], > + ... '0001-12': ... 'join script does not include "joinscripthelper.lib"' ], > + ... '0001-13': ... 'join script does not call "joinscript_init"' ], > + ... '0001-14': ... 'join script does not call > "joinscript_save_current_version"' ], > > Die IDs müssen stabil bleiben und dürfen NICHT neu durchnummeriert werden, weil > diese auch in den ganzen debian/ucslint.overrides Dateien verwendet werden. > Bitte zumindest das Rückgängig machen und 0001-10 irgendwie als "Unused, moved > to 0017-*" markieren. > > ucslint/0017-Shell.py > + for root, dirs, files in os.walk('.'): > Hier bitte den FilteredDirWalkGenerator() aus ucslint/base.py benutzen, weil > der korrekt mit den ganzen Dateien umgeht, die ignoriert werden sollen. Wurde soweit angepasst. rev34511
OK: ucslint prüft jetzt auf alle Varianten von eval $(ucr shell) OK: ucslint verwendet DirWalkGenerator OK: ucslint Testframework OK: keine weiteren Vorkommnisse in UCS 3.1 gefunden OK: Changelogeintrag
UCS 3.1-0 has been released: http://forum.univention.de/viewtopic.php?f=54&t=2125 If this error occurs again, please use "Clone This Bug".