lowpixelgg / saturn

Other
13 stars 6 forks source link

Implementação de Medidas de Segurança nas Rotas de Perfil #6

Closed TryLooney closed 11 months ago

TryLooney commented 11 months ago

Prezada equipe de desenvolvimento,

Durante a realização de testes, identifiquei alguns problemas de segurança em diversas rotas relacionadas aos perfis de usuário. Estes problemas estão comprometendo a integridade das informações e a privacidade dos usuários. Gostaria de solicitar a implementação urgente de medidas de proteção nas seguintes rotas:

  1. Rota de Visitantes (https://saturn-api.rocketmta.com/v1/social/profiles/subscribers/visitors/): Observei a ausência de proteção nesta rota, que deveria ser restrita para preservar a privacidade do usuário. Atualmente, diversos dados estão sendo expostos, comprometendo a segurança da informação.

  2. Rota de Busca de Usuários (https://saturn-api.rocketmta.com/v1/social/profile/search): Identifiquei que esta rota permite requisições sem bloqueios temporais, sem cacheamento, e facilita o uso malicioso por usuários. Recomendo a implementação de medidas de controle de acesso para prevenir usos indevidos.

  3. Rota de Atualização de Biografia (https://saturn-api.rocketmta.com/v1/social/profiles?action=update:bio): Notei a falta de proteção nesta rota, permitindo a inclusão de informações proibidas para pessoas sem Premium, como links para plataformas externas (ex.: Twitch, Instagram).

  4. Rotas de Seguidores e Deixar de Seguir (https://saturn-api.rocketmta.com/v1/social/profiles/subscribers/follow): Detectei a falta de restrições nas rotas que requerem followers_id e following_id, permitindo a inserção de qualquer dado. Isso possibilita que terceiros sigam ou deixem de seguir usuários sem o devido consentimento. Recomendo a implementação de controles para garantir a autenticidade das interações.

Agradeço a atenção dedicada a esta questão crítica de segurança.

vitordvr commented 11 months ago

Novamente, obrigado pelo empenho e dedicação em colaborar com o projeto.

Revisei minunciosamente todos os pontos e, após uma verificação extensa confirmei que apenas os pontos 3,4 realmente precisavam de ajustes que foram feitos no commit 29cc703 fora isso nenhum outro ponto precisou de uma correção/alteração pois as informações retornadas em tais rotas são de cunho publico (que aparecem no perfil do usuário). Se você encontrou ou considera alguma informação sigilosa por favor nos escreva aqui.

TryLooney commented 11 months ago

Novamente, obrigado pelo empenho e dedicação em colaborar com o projeto.

Revisei minunciosamente todos os pontos e, após uma verificação extensa confirmei que apenas os pontos 3,4 realmente precisavam de ajustes que foram feitos no commit 29cc703 fora isso nenhum outro ponto precisou de uma correção/alteração pois as informações retornadas em tais rotas são de cunho publico (que aparecem no perfil do usuário). Se você encontrou ou considera alguma informação sigilosa por favor nos escreva aqui.

Como nas páginas não é aparente quem visitou o perfil, simbolizando apenas por um número e imagem placeholder, achava que essa informação também deveria ser sigilosa no backend, mas caso seja essa a intenção, tudo certo. Na rota de busca de usuários, creio que a falta de qualquer tipo de proteção poderia levar usuários mal intencionados a coletar dados indevidos, possibilitando, como no caso em que pratiquei para testes, listar todos os usuários colocando-os para seguir alguém ou qualquer outra ação indevida.

vitordvr commented 11 months ago

Novamente, obrigado pelo empenho e dedicação em colaborar com o projeto. Revisei minunciosamente todos os pontos e, após uma verificação extensa confirmei que apenas os pontos 3,4 realmente precisavam de ajustes que foram feitos no commit 29cc703 fora isso nenhum outro ponto precisou de uma correção/alteração pois as informações retornadas em tais rotas são de cunho publico (que aparecem no perfil do usuário). Se você encontrou ou considera alguma informação sigilosa por favor nos escreva aqui.

Como nas páginas não é aparente quem visitou o perfil, simbolizando apenas por um número e imagem placeholder, achava que essa informação também deveria ser sigilosa no backend, mas caso seja essa a intenção, tudo certo. Na rota de busca de usuários, creio que a falta de qualquer tipo de proteção poderia levar usuários mal intencionados a coletar dados indevidos, possibilitando, como no caso em que pratiquei para testes, listar todos os usuários colocando-os para seguir alguém ou qualquer outra ação indevida.

Qual tipo de segurança você está se referindo? Informações? Se entendi bem, nenhuma rota expõe um dado sensível.

Rota de Busca de Usuários (https://saturn-api.rocketmta.com/v1/social/profile/search):

"id": "429efe13-ebae-4321-b60e-afd4c413b7c6",
"username": "flashii",
"userid": "a420214b-e21f-4231-9147-7298de36cc02",
"createdAt": "2022-12-29T15:09:15.738Z",
"role": "ADMIN",
"isPremium": true,
"isEarlySupporter": true,
"isVerified": true,
"avatar": "https://storage.googleapis.com/rocketmta/avatars/1701025381079-1701025567179.jpeg",
"banner": "https://storage.googleapis.com/rocketmta/banners/1694175038361.webp",
"description": "<p>pinxsel</p><p><br></p><p><br></p><p>rocketmta.com</p>",
"nickname": "flashii",
"region_city": "Bourbank",
"region_uf": "CA",
"region_country": "USA",
"badges": [],
"medals": []
TryLooney commented 11 months ago

Novamente, obrigado pelo empenho e dedicação em colaborar com o projeto. Revisei minunciosamente todos os pontos e, após uma verificação extensa confirmei que apenas os pontos 3,4 realmente precisavam de ajustes que foram feitos no commit 29cc703 fora isso nenhum outro ponto precisou de uma correção/alteração pois as informações retornadas em tais rotas são de cunho publico (que aparecem no perfil do usuário). Se você encontrou ou considera alguma informação sigilosa por favor nos escreva aqui.

Como nas páginas não é aparente quem visitou o perfil, simbolizando apenas por um número e imagem placeholder, achava que essa informação também deveria ser sigilosa no backend, mas caso seja essa a intenção, tudo certo. Na rota de busca de usuários, creio que a falta de qualquer tipo de proteção poderia levar usuários mal intencionados a coletar dados indevidos, possibilitando, como no caso em que pratiquei para testes, listar todos os usuários colocando-os para seguir alguém ou qualquer outra ação indevida.

Qual tipo de segurança você está se referindo? Informações? Se entendi bem, nenhuma rota expõe um dado sensível.

Rota de Busca de Usuários (https://saturn-api.rocketmta.com/v1/social/profile/search):

"id": "429efe13-ebae-4321-b60e-afd4c413b7c6",
"username": "flashii",
"userid": "a420214b-e21f-4231-9147-7298de36cc02",
"createdAt": "2022-12-29T15:09:15.738Z",
"role": "ADMIN",
"isPremium": true,
"isEarlySupporter": true,
"isVerified": true,
"avatar": "https://storage.googleapis.com/rocketmta/avatars/1701025381079-1701025567179.jpeg",
"banner": "https://storage.googleapis.com/rocketmta/banners/1694175038361.webp",
"description": "<p>pinxsel</p><p><br></p><p><br></p><p>rocketmta.com</p>",
"nickname": "flashii",
"region_city": "Bourbank",
"region_uf": "CA",
"region_country": "USA",
"badges": [],
"medals": []

O que me refiro a segurança é um loop de requisições para a rota https://saturn-api.rocketmta.com/v1/social/profile/search com a finalidade de coletar dados de TODOS os usuários, já que não existe nenhum rate limit. Exemplo de mal uso:

import { follow, profile, user } from "../user";

const myProfile = await profile.get({ id: "452078" });

let usersFetched = 0;
let totalCount = (await user.getRandom({})).body.totalCount;

while (usersFetched < totalCount) {
  const users = await user.getRandom({ randomize: true });

  users.body.data.map(async (fetchedUser) => {
    usersFetched++;

    if (
      myProfile.body.followers.find(
        (follower) => follower.followers_id === fetchedUser.userid
      )
    )
      return console.log(
        `user ${fetchedUser.username} already following, skipping`
      );

    const followResponse = await follow.follow({
      followers_id: myProfile.body.id,
      following_id: fetchedUser.userid,
    });

    console.log(
      followResponse.statusCode === 200
        ? `${fetchedUser.username} is now following`
        : `error on set follow to ${fetchedUser.username}`
    );
  });
}

Por meio deste código, foi possível listar todos os usuários forçando-os a me seguirem. A facilidade em que essa rota de buscar usuários me deu ao fazer este código foi gigantesca, caso exista outro problema semelhante, será uma mão na roda utilizar essa rota ao invés de pegar os dados dos usuários um a um.

obs: user.getRandom é a função que trabalha em cima da rota https://saturn-api.rocketmta.com/v1/social/profile/search, personalizando-a de acordo com a preferência por meio das opções per_page e randomize.

vitordvr commented 11 months ago

Perfeito, mas como mencionado acima esse código já foi alterado em: #29cc703, sobre o rate limit a mesma coisa, não sei se não chegou a obter as novas atualizações mas também foi corrigido em #f2f4bfc (somente para todas de CRUD) excluindo get que nesse caso não necessita de um rate limite menor como (3,4) 🤝

Irei finalizar a issue com este comentário, pois acredito que tenha sido resolvida nos commits. Caso haja alguma dúvida ou queira debater, por favor, envie uma mensagem para #ask-developers no grupo de desenvolvedores da Rocket.