Liferay 5.2.3 javascript injection vulnerability




written by Marco Ferretti on September 27, 2011, at 04:43 PM

en it

Secondo il bug traker di Liferay il ticket LPS-5545 e' sempre aperto e riguarda la versione 5.2.3

Ho testato la vulnerabilita' su Liferay 6 e sembra che sia stata chiusa ( almeno in questa versione ). Allora ho controllato il codice e mi sono accorto che tutto quello che serve per chiudere la falla anche sulla versione 5 ... e' tutto gia' li !!!

Cosa fare

Usate patch di Unix ( linux ) per applicare questa patch ( Attach:LanguageImpl.java.patch ), ricompilate e generate il jar file portal-impl.jar e avete fatto .

Che modifiche sono state fatte

La patch controlla il contenuto del parametro dell'url languageId confrontandolo con una lista di valori accettati ( nello specifico _localesMap e _charEncodings ) che sono gia' disponibili; modifichiamo un pelo il costruttore in modo da assicurarci che le mappe siano compilate :

        private LanguageImpl() {
                String[] localesArray = PropsValues.LOCALES;

                _locales = new Locale[localesArray.length];
                _localesSet = new HashSet<Locale>(localesArray.length);
                _localesMap = new HashMap<String, Locale>(localesArray.length);
                _charEncodings = new HashMap<String, String>();

                for (int i = 0; i < localesArray.length; i++) {
                        String languageId = localesArray[i];

                        int pos = languageId.indexOf(StringPool.UNDERLINE);

                        String language = languageId.substring(0, pos);
                        //String country = languageId.substring(pos + 1);

                        Locale locale = LocaleUtil.fromLanguageId(languageId);

                        _charEncodings.put(locale.toString(), StringPool.UTF8);                 // backport of white list of language ids

                        _locales[i] = locale;
                        if (!_localesMap.containsKey(language)) {//backport of white list of language ids
                                _localesMap.put(language, locale);
                        }
                        _localesSet.add(locale);
                        //_localesMap.put(language, locale);//backport of white list of language ids
                        _charEncodings.put(locale.toString(), StringPool.UTF8);

                }
        }

e aggiungiamo il controllo

if (_localesMap.containsKey(languageId) || _charEncodings.containsKey(languageId)) {// backport of white list of language ids

in

public String getLanguageId(HttpServletRequest request)

appena prima di ritornare il language id :

        public String getLanguageId(HttpServletRequest request) {
                String languageId = ParamUtil.getString(request, "languageId");

                if (Validator.isNotNull(languageId)) {
                        if (_localesMap.containsKey(languageId) || _charEncodings.containsKey(languageId)) {// backport of white list of language ids
                                return languageId;
                        }
                }

                Locale locale = PortalUtil.getLocale(request);

                return getLanguageId(locale);
        }

Buon patching !!! (:fi:)

Leave a comment

Name (required)
E-mail (required, will not be published)
Website
Comment

Enter value: Captcha