Merge pull request #5365 from Citadel-Station-13/upstream-merge-35399

[MIRROR] [s]Closes exploits in proc calling admin datum procs.
This commit is contained in:
LetterJay
2018-02-08 07:10:55 -06:00
committed by GitHub
+32 -2
View File
@@ -27,6 +27,14 @@ GLOBAL_PROTECT(href_token)
var/deadmined var/deadmined
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE) /datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
if (!target) //only del if this is a true creation (and not just a New() proc call), other wise trialmins/coders could abuse this to deadmin other admins
QDEL_IN(src, 0)
CRASH("Admin proc call creation of admin datum")
return
if(!ckey) if(!ckey)
QDEL_IN(src, 0) QDEL_IN(src, 0)
throw EXCEPTION("Admin datum created without a ckey") throw EXCEPTION("Admin datum created without a ckey")
@@ -48,8 +56,20 @@ GLOBAL_PROTECT(href_token)
else else
deactivate() deactivate()
/datum/admins/Destroy()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return QDEL_HINT_LETMELIVE
. = ..()
/datum/admins/proc/activate() /datum/admins/proc/activate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
GLOB.deadmins -= target GLOB.deadmins -= target
GLOB.admin_datums[target] = src GLOB.admin_datums[target] = src
deadmined = FALSE deadmined = FALSE
@@ -58,6 +78,11 @@ GLOBAL_PROTECT(href_token)
/datum/admins/proc/deactivate() /datum/admins/proc/deactivate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
GLOB.deadmins[target] = src GLOB.deadmins[target] = src
GLOB.admin_datums -= target GLOB.admin_datums -= target
deadmined = TRUE deadmined = TRUE
@@ -70,14 +95,14 @@ GLOBAL_PROTECT(href_token)
if(IsAdminAdvancedProcCall()) if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!" var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]") message_admins("[key_name_admin(usr)][msg]")
log_admin_private("[key_name(usr)][msg]") log_admin("[key_name(usr)][msg]")
return return
if(istype(C)) if(istype(C))
if(C.ckey != target) if(C.ckey != target)
var/msg = " has attempted to associate with [target]'s admin datum" var/msg = " has attempted to associate with [target]'s admin datum"
message_admins("[key_name_admin(C)][msg]") message_admins("[key_name_admin(C)][msg]")
log_admin_private("[key_name(C)][msg]") log_admin("[key_name(C)][msg]")
return return
if (deadmined) if (deadmined)
activate() activate()
@@ -88,6 +113,11 @@ GLOBAL_PROTECT(href_token)
GLOB.admins |= C GLOB.admins |= C
/datum/admins/proc/disassociate() /datum/admins/proc/disassociate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
if(owner) if(owner)
GLOB.admins -= owner GLOB.admins -= owner
owner.remove_admin_verbs() owner.remove_admin_verbs()