Кража привилегий и обход бана -проблема, с которой сталкиваются владельцы серверов…

В данной теме поговорим о проблеме подмены SteamID и базовых вариантах усложнения этого действия для нечестных игроков.

Чем грозит подмена SteamID?

  • Кража привилегий у другого игрока, допустим админ права
  • Переадресация бана на другого игрока, чей steamid был скопирован и так же обход бана.

Настройка Reunion / Dproto

Рассмотрим конфиг модуля и варианты его настройки
Данные изменения повлекут смену идентификаторов и как следствие сброс статистики, рангов и всего остального, что завязано на них

В самом начале конфига у нас есть подсказка, как будут генерироваться steamid игроков на нашем сервере

# ClientID types (for cid_* options)
#  1: Real (or generated by HW) steam (STEAM_xx:xx:xx)
#  2: Real (or generated by HW) valve (VALVE_xx:xx:xx)
#  3: STEAM_ by IP
#  4: VALVE_ by IP
#  5: Deprecated - client will be rejected
#  6: reserved for future use
#  7: HLTV
#  8: STEAM_ID_LAN
#  9: STEAM_ID_PENDING
#  10: VALVE_ID_LAN
#  11: VALVE_ID_PENDING
#  12: STEAM_666:88:666

Пояснение:

1 - Настоящий (или сгенерированный по HW (Hardware Identification Number)) идентификатор, который будет иметь вид STEAM_xx:xx:xx
2 - Настоящий (или сгенерированный по HW (Hardware Identification Number)) идентификатор, который будет иметь вид VALVE_xx:xx:xx
3 - Генерирование будет происходить по IP игрока и идентификатор будет иметь вид STEAM_xx:xx:xx
4 - Генерирование будет происходить по IP игрока и идентификатор будет иметь вид VALVE_xx:xx:xx
5 - Запрет на подключение клиента к серверу
6 - Идентификатор будет зарезервирован для будущего клиента и будет иметь вид STEAM_xx:xx:xx
7 - Назначает идентификатор HLTV
8 - Идентификатор примет вид STEAM_ID_LAN
9 - Идентификатор примет вид STEAM_ID_PENDING
10 - Идентификатор примет вид VALVE_ID_LAN
11 - Идентификатор примет вид VALVE_ID_PENDING
12 - Идентификатор примет вид 666:88:666

Для начала укажем, как будет генерироваться steamid для каждого протокола клиента

# For Legit Steam clients (default is real STEAM_xx:xx:xx [1])
cid_Steam = 1

Steam клиент, советую оставить 1, подделать его крайне сложно и "время жизни" на сервере будет не долгое

# Client recognized as pending when they sucessfully authorized, but did not get steam id
# REMARK: Actually, it got steamid, but it is useless (STEAM_0:0:0 for example)
# default is STEAM_ID_PENDING [9]
cid_SteamPending = 9

Данный идентификатор сработает, когда steam сервер отвалится и клиент не сможет получить свой идентификатор. Блокируем

cid_SteamPending = 5
# for HLTV (default is HLTV [7])
cid_HLTV = 7

Не важно, есть у нас HLTV или его нет, мы запрещаем подключение других, не известных нам клиентов с идентификатором HLTV

cid_HLTV =5

Если у Вас используется HLTV на сервере, то просто укажите его ip в настройке

HLTVExcept_IP = 127.0.0.1
# for p.47 clients that do not support unique id generation (default is STEAM_ID_LAN [8])
cid_NoSteam47 = 8
# for p.48 clients that do not support unique id generation (default is VALVE_ID_LAN [10])
cid_NoSteam48 = 8

Старые игровые клиенты, почти не используются и чаще всего эксплуатируются из-за читов, которые требуют конкретный протокол клиента для своей работы. Запрещаем этих единичных пользователей.

cid_NoSteam47 = 5
cid_NoSteam48 = 5
# For players having revEmu ( >= 9.74) on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_RevEmu = 1

Выставляем вид VALVE_xx:xx:xx

cid_RevEmu = 2
# For players having RevEmu 2013 on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_RevEmu2013 = 1

Выставляем вид VALVE_xx:xx:xx

cid_RevEmu2013 = 2
# For players having SteamClient 2009 / revEmu > 9.82 on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_SC2009 = 1

Выставляем вид VALVE_xx:xx:xx

cid_SC2009 = 2
# For players having old revEmu on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_OldRevEmu = 1

Выставляем вид VALVE_xx:xx:xx

cid_OldRevEmu = 2
# For players having hCupa's SteamEmu on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_SteamEmu = 1

Выставляем вид VALVE_xx:xx:xx

cid_SteamEmu = 2
# For players having AVSMP (Cracked Steam) on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_AVSMP = 1

Мертвый эмулятор. Блокируем

cid_AVSMP = 5
# For SETTI ServerScanner
# default is STEAM_xx:xx:xx generated by IP [3]
cid_Setti = 3

Мертвый эмулятор. Блокируем

cid_Setti = 5
# For SXEI Clients
# default is real STEAM_xx:xx:xx [1]
cid_SXEI = 1

Мертвый эмулятор. Блокируем

cid_SXEI = 5
# For players having SmartSteamEmu > 1.2.4 on client-side:
# default is real STEAM_xx:xx:xx [1]
cid_SSE3 = 1

Выставляем вид VALVE_xx:xx:xx

cid_SSE3 = 2
# SteamIdHashSalt (string)
# Salt string for SteamIDs hashing. Irreversibly changes SteamIDs. Applies only to SteamIDs generated by emulators.
# Should be more than 16 chars length. If string is empty, hashing is not applied.
SteamIdHashSalt =

Данная настройка (она же "соль") скроет истинный steamid игроков на вашем сервере. Минимальная длина 16 символов !
Придумайте свою строку, можно использовать буквы разного регистра, цифры и символы (!@#$% и т.д.)
SteamIdHashSalt = QWERTYASDFG123456
На лицензионный клиент игры данная настройка не распространяется.

# EnableGenPrefix2 (0 / 1)
# Enable second prefix (0 or 1) for generated by HW authids. Reduces chance of authid collisions. Works only with configured SteamIdHashSalt.
EnableGenPrefix2 = 1

Активируем генерирование второго префикса, когда используется "соль"

Делаем разграничение префиксов

Префикс - это числа, которые мы видим перед самим сгенерированный id клиента STEAM_xx:xx:xxxxxx
* Префикс 1 Допустимые значения [0-99]
* Префикс 2 Допустимые значения [0-99]
Числовой идентификатор клиента

# IPGen_Prefix1 (int)
# STEAM_a:b:c
# first prefix (a) for authids generated by IP
IPGen_Prefix1 = 0

Первый префикс, который будет указан, если у протокола стоит генерирование по IP. Данный тип генерирования не удобен, т.к. очень мало клиентов с статическим IP адресом.
Не меняем

# IPGen_Prefix2 (int)
# STEAM_a:b:c
# second prefix (b) for authids generated by IP
IPGen_Prefix2 = 4

Второй префикс, который будет указан, если у протокола стоит генерирование по IP.
Не меняем

# Native_Prefix1 (int)
# STEAM_a:b:c
# first prefix (a) for authids generated by native auth method (Steam)
Native_Prefix1 = 0;

Первый префикс, который будет задан Steam клиенту. Дадим ему максимальный номер.

Native_Prefix1 = 99;

Придется поправить csbans
Либо используйте число от 0 до 9

# RevEmu_Prefix1 (int)
# STEAM_a:b:c
# first prefix (a) for authids generated by Steamclient 2009
SC2009_Prefix1 = 0;

Зададим любой порядковый номер, чтобы отделить протокол от остальных

SC2009_Prefix1 = 12;
# RevEmu_Prefix1 (int)
# STEAM_a:b:c
# first prefix (a) for authids generated by RevEmu
RevEmu_Prefix1 = 1;

Зададим любой порядковый номер, чтобы отделить протокол от остальных

RevEmu_Prefix1 = 13;

Остальные протоколы трогать не будет, их префиксы и так уникальны от 1 до 7.

Ура, конец спойлера!

ННастройка ReChecker

Мы можем обнаружить запрещенные файлы в клиенте игрока, которые имеют функционал подмены steamid и не пускать таких игроков на свой сервер.
Применять или нет наказание для таких игроков, каждый админ решает сам, т.к. протекторы используются не только для подмены steamid, но и для защиты своего клиента игроками от не добросовестных админов желающих испортить клиент.

Актуальную базу вы можете найти в релизах
Приведем в качестве примера несколько строк обнаружения таких запрещенных файлов

Примеры

"/CSXGuard.dll"                               UNKNOWN        "amx_ban 1440 [userid] 'Protector';wait;rc_log            Protector        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"/CTShield.dll"                               UNKNOWN        "amx_ban 1440 [userid] 'Protector';wait;rc_log            Protector        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"/protector.dll"                UNKNOWN        "amx_ban 1440 [userid] 'Protector';wait;rc_log            Protector        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"        BREAK
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
"/change~1.dll"                         UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"        BREAK

"/bin/steamid_changer.dll"            UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"changersteambyostrog.dll"            UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"/bin/steam.dll"                    UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"/SteamID.dll"                    UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"     BREAK
"/ChangerSteamByOstrog.dll"                   UNKNOWN        "amx_ban 1440 [userid] 'SteamID Changer';wait;rc_log        SteamID Changer        | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"        BREAK

ВВыдача прав на сервере

При назначении привилегий другим игрокам на сервере админ сталкивается с выбором, какой вариант выбрать?

Напомним, что у нас есть несколько способов назначить права другому игроку:

  • По нику и паролю
  • По IP по ip+пароль
  • По SteamID по steamid+пароль

Первый вариант через ник и пароль плох тем, что вы не можете гарантировать безопасность такой учетной записи, т.к. записи хранятся в открытом виде и человека нужно просто заманить на сервер, где будут получены его steamid, setinfo (all) и многое другое.
Кроме того, человек может отдать свои данные (логин и пароль) друзьям и они будут использовать его права, данный вариант не приятен администраторам, которые доверяют полномочия одному человеку, а на практике полномочия использует группа лиц без ведома главного администратора. Так же это может сказаться на продаже привилегий, зачем людям тратить деньги, если можно попросить учетную запись у своего друга и получить все бесплатно. Данный вариант менее защищенный, не советую его использовать.
Второй
вариант тоже не идеален, т.к. статический IP большая редкость. А динамические адреса часто меняются и вас постоянно будут спрашивать "куда делись мои права?". Идеальный вариант, если у человека статический ip.
Третий
вариант - steamid+пароль. Привязка прав происходит по уникальному идентификатору клиента, который он получает на сервере. Если игрок не будет менять non-steam сборку каждую неделю и не использовать средства подмены/рандомизации steamid, то это наш самый стабильный вариант. Главное, не забудьте указать "соль", которую мы рассмотрели в разделе выше
Просто steamid привязку (без пароля) вы можете назначить игрокам с лицензионной версией игры (Steam).
Steamid+пароль золотая середина, которую стоит использовать, но для этого нужно настроить свой сервер.