JBoss SEAM i EJB-QL injection
October 11th, 2007
2 comments
A jednak. Nawet tak zaawansowany framework jak JBoss SEAM może być podatny na ataki EJB-QL injection. EJB-QL injection jest podobny do SQL injection, z tą różnicą że nie atakujemy kodu SQL a kod EJB-QL.
Mam najnowszą wersję: jboss-seam-2.0.0.CR2. Błąd jest w pomyślne na klasę: org.jboss.seam.framework.Query w metodzie getRenderedEjbql(). Czytamy tam:
if ( getOrder()!=null ) builder.append(" order by ").append( getOrder() );
return builder.toString();Parametr order pochodzi z żądania HTTP. To co zły człowiek możemy zrobić zależy od implementacji JPA i serwera bazy danych. Mi nie przychodzi akurat nic złego do głowy. Uważam jednak, że ten kod biblioteki SEAM trzeba jeszcze raz przemyśleć i koniecznie przepisać. Zapewne pogadamy o tym na Warszawskim JUGu.
Aktualizacja po przerwie na kanapkę.
W nagrodę za znalezienie błędu w SEAMie postanowiłem zjeść kanapkę. Dawka energii sprawiła, że znalazłem szybkie rozwiązanie. W klasie dziedziczącej – implementującej naszą listę obiektów musimy ustalić listę dozwolonych sortowań, na przykład tak: private static final String[] ORDERS = {name asc","name desc","id asc","id desc"};
@Override
public void setOrder(String order){
if (Arrays.asList(ORDERS).contains(order)) {
super.setOrder(order);
}
} W ten sposób zabezpieczymy się przed ryzykiem na przykład tego, że zły człowiek wciśnie nam sortowanie po procedurze SQL odpowiedzialnej za kasowanie userów.