Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
Struts 2 Bad Practices: Session Map Tampering
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface 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 outro lado, o Struts 2.x associa automaticamente os dados de solicitações provenientes do usuário às propriedades da Ação por meio de assessores públicos definidos na Ação. Como as interfaces Aware exigem a implementação do setter público definido na interface Aware, esse setter também será automaticamente associado a qualquer parâmetro de solicitação que corresponder ao nome do setter da interface Aware, o que pode permitir que invasores remotos modifiquem valores de dados em tempo de execução através de um parâmetro trabalhado para um aplicativo que implementa uma interface afetada, conforme demonstrado pelas interfaces
SessionAware
, RequestAware
e ApplicationAware
.A URL a seguir permitirá que um atacante substitua o atributo "roles" no mapa de sessão. Isso pode acabar permitindo que o invasor se torne um administrador.
http://server/VulnerableAction?session.roles=admin
Embora essas interfaces só exijam a implementação dos assessores setter, se o getter correspondente também for implementado, as alterações nessas coleções de mapas terão o escopo definido para a sessão, em vez de somente afetarem o escopo da solicitação atual.