Un API es un contrato entre un autor de llamada y un receptor de llamada. Las formas de abuso de API más comunes los produce el autor de llamada cuando no consigue atender su fin de este contrato. Por ejemplo, si un programa no consigue llamar chdir() después de llamar chroot(), se viola el contrato que especifica cómo cambiar el directorio de origen activo de una forma segura. Otro buen ejemplo de un abuso de manual es esperar que el receptor devuelva una información de DNS de confianza al autor de llamada. En este caso, el autor de llamada abusa el API del receptor haciendo determinadas suposiciones sobre su comportamiento (que el valor de retorno se puede usar con fines de autenticación). También se puede violar el contrato entre el autor de llamada y el receptor desde el otro lado. Por ejemplo, si un codificador envía SecureRandom y devuelve un valor no aleatorio, se viola el contrato.
Struts 2 Bad Practices: Request Map Tampering
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
y org.apache.struts2.interceptor.RequestAware
. Con el fin de incorporar cualquiera de estos mapas de datos en el código de Actions, los desarrolladores deben implementar el marco que se especifica en la interfaz (por ejemplo: setSession
para la interfaz SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
Por otro lado, Struts 2.x enlaza automáticamente los datos de la solicitud del usuario con las propiedad de la acción a través de descriptores de acceso definidos en la acción. Dado que las interfaces de Aware requieren que se implemente el setter público definido en la interfaz de Aware, este setter se enlazará también de forma automática con cualquier parámetro de solicitud que sea coincidente con el nombre de la interfaz de Aware que pueda permitir a los usuarios malintencionados remotos modificar los valores del tiempo de ejecución a través de un parámetro proporcionado a una aplicación que implemente una interfaz afectada, como demuestran las interfaces
SessionAware
, RequestAware
, ApplicationAware
.La siguiente URL permitirá a un usuario malintencionado sobrescribir el atributo de "roles" en el mapa de la sesión, lo que potencialmente puede permitirle convertirse en administrador.
http://server/VulnerableAction?session.roles=admin
Mientras que estas interfaces sólo requieren la implementación de los descriptores de acceso del setter, si el correspondiente getter también está implementado, los cambios en estas colecciones de mapas se almacenarán en la sesión en lugar de afectar únicamente a la solicitud actual.