In 88754ee5b7c7f745f1172cf0238f8e65442e1bd0 (27 July 2013 (!)) I converted QuizGame to use an API module instead of the then-deprecated sajax_* functions provided by MediaWiki core to make the extension compatible with MediaWiki 1.21.
The old AJAX entry point, wfQuestionGameAdmin, which despite the name wasn't admin-only nor truly intended to be such as it handles flagging, did feature a rudimentary "is the request allowed?" check; but I'm not sure if it really provided any real security. Either way, when creating the API module, even this check was lost.
So right now all the API module really cares about is that:
1.) The request has a valid anti-CSRF token (new mw.Api().postWithEditToken( ... ) will take care of that)
2.) The request was POSTed
3.) The quizaction and id parameters are set and that the former corresponds to one of the actions handled by the module's switch() loop
As long as those requirements are met, an attacker can easily abuse the QuizGame administrative API to their nefarious purposes - quizadmin rights not needed!
Hilariously, though, the UI in /extensions/QuizGame/includes/specials/SpecialQuizGameHome.php does perform correct user right checks for the admin panel and whatnot and redirects unauthorized users to the main quiz game landing page.
Quick patch to add block and proper user rights checking to the QuizGame admin API (while allowing all users to flag quizzes):
diff --git a/includes/api/ApiQuizGame.php b/includes/api/ApiQuizGame.php index 3236d7e..56d5a82 100644 --- a/includes/api/ApiQuizGame.php +++ b/includes/api/ApiQuizGame.php @@ -34,6 +34,21 @@ class ApiQuizGame extends ApiBase { // ApiBase's getDB() supports only slave connections, lame... $dbw = wfGetDB( DB_PRIMARY ); + // Fail early if the user is sitewide blocked. + // (This snippet copied from MW core /includes/api/ApiTag.php) + $block = $user->getBlock(); + if ( $block && $block->isSitewide() ) { + $this->dieBlocked( $block ); + } + + // Allow non-quizadmins to use the flagging feature but require quizadmin + // rights for all other stuff + if ( $action !== 'flagItem' ) { + if ( !$user->isAllowed( 'quizadmin' ) ) { + $this->dieWithError( 'badaccess-group0' ); + } + } + switch ( $action ) { case 'unprotectItem': $dbw->update(