Skip to content

Commit

Permalink
Merge pull request from GHSA-mp9m-g7qj-6vqr
Browse files Browse the repository at this point in the history
* Query members for unchunked guilds in massban

* that thing that is a thing ;)
  • Loading branch information
Jackenmen authored Oct 27, 2020
1 parent 21f9a6f commit 726bfd3
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 24 deletions.
16 changes: 13 additions & 3 deletions docs/changelog_3_4_0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,26 @@ Redbot 3.4.1 (2020-10-27)
Read before updating
--------------------

1. This Red update bumps discord.py to version 1.5.1, which explicitly requests Discord intents. Red requires all Prvileged Intents to be enabled. More information can be found at :ref:`enabling-privileged-intents`.
2. Mutes functionality has been moved from the Mod cog to a new separate cog (Mutes) featuring timed and role-based mutes. If you were using it (or want to start now), you can load the new cog with ``[p]load mutes``. You can see the full `Mutes changelog below <important-341-1>`.
3. Information for Audio users that are using an external Lavalink instance (if you don't know what that is, you should skip this point):
1. This release fixes a security issue in Mod cog. See `Security changelog below <important-341-2>` for more information.
2. This Red update bumps discord.py to version 1.5.1, which explicitly requests Discord intents. Red requires all Prvileged Intents to be enabled. More information can be found at :ref:`enabling-privileged-intents`.
3. Mutes functionality has been moved from the Mod cog to a new separate cog (Mutes) featuring timed and role-based mutes. If you were using it (or want to start now), you can load the new cog with ``[p]load mutes``. You can see the full `Mutes changelog below <important-341-1>`.
4. Information for Audio users that are using an external Lavalink instance (if you don't know what that is, you should skip this point):

We've updated our `application.yml file <https://github.com/Cog-Creators/Red-DiscordBot/blob/3.4.1/redbot/cogs/audio/data/application.yml>`_ and you should update your instance's ``application.yml`` appropriately.
Please ensure that the WS port in Audio's settings (``[p]llset wsport``) is set to the port from the ``application.yml``.

End-user changelog
------------------

.. _important-341-2:

Security
********

**NOTE:** If you can't update immediately, we recommend globally disabling the affected command until you can.

- **Mod** - Fixed unauthorized privilege escalation exploit in ``[p]massban`` (also called ``[p]hackban``) command. Full security advisory `can be found on our GitHub <https://github.com/Cog-Creators/Red-DiscordBot/security/advisories/GHSA-mp9m-g7qj-6vqr>`_.

Core Bot
********

Expand Down
55 changes: 34 additions & 21 deletions redbot/cogs/mod/kickban.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import contextlib
import logging
from datetime import datetime, timedelta, timezone
from typing import Optional, Tuple, Union
from typing import Dict, List, Optional, Tuple, Union

import discord
from redbot.core import commands, i18n, checks, modlog
Expand Down Expand Up @@ -440,28 +440,41 @@ def remove_processed(ids):
await show_results()
return

# We need to check here, if any of the users isn't a member and if they are,
# we need to use our `ban_user()` method to do hierarchy checks.
members: Dict[int, discord.Member] = {}
to_query: List[int] = []

for user_id in user_ids:
user = guild.get_member(user_id)
if user is not None:
if user_id in tempbans:
# We need to check if a user is tempbanned here because otherwise they won't be processed later on.
continue
member = guild.get_member(user_id)
if member is not None:
members[user_id] = member
elif not guild.chunked:
to_query.append(user_id)

# If guild isn't chunked, we might possibly be missing the member from cache,
# so we need to make sure that isn't the case by querying the user IDs for such guilds.
while to_query:
queried_members = await guild.query_members(user_ids=to_query[:100], limit=100)
members.update((member.id, member) for member in queried_members)
to_query = to_query[100:]

# Call `ban_user()` method for all users that turned out to be guild members.
for member in members:
try:
success, reason = await self.ban_user(
user=member, ctx=ctx, days=days, reason=reason, create_modlog_case=True
)
if success:
banned.append(user_id)
else:
# Instead of replicating all that handling... gets attr from decorator
try:
success, reason = await self.ban_user(
user=user, ctx=ctx, days=days, reason=reason, create_modlog_case=True
)
if success:
banned.append(user_id)
else:
errors[user_id] = _("Failed to ban user {user_id}: {reason}").format(
user_id=user_id, reason=reason
)
except Exception as e:
errors[user_id] = _("Failed to ban user {user_id}: {reason}").format(
user_id=user_id, reason=e
)
errors[user_id] = _("Failed to ban user {user_id}: {reason}").format(
user_id=user_id, reason=reason
)
except Exception as e:
errors[user_id] = _("Failed to ban user {user_id}: {reason}").format(
user_id=user_id, reason=e
)

user_ids = remove_processed(user_ids)

Expand Down

0 comments on commit 726bfd3

Please sign in to comment.