メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rule POS36-C

権限を放棄する場合は正しい取り消し順序に従う

説明

ルール定義

権限を放棄する場合は正しい取り消し順序に従います。1

Polyspace 実装

ルール チェッカーは、"権限を削除する順序が正しくありません" をチェックします。

すべて展開する

問題

権限を削除する順序が正しくありませんでは、権限を削除する順序がチェックされます。昇格された権限のうち低い権限よりも前に高い権限を削除すると、Polyspace により欠陥が報告されます。たとえば、昇格された権限のうち補助グループ権限を削除する前に、プライマリ グループ権限を削除する場合です。

リスク

誤った順序で権限を削除すると、低い権限を削除するために必要な高い権限が先に削除されてしまう可能性があります。順序が正しくないと権限が削除されず、プログラムのセキュリティが侵害される可能性があります。

修正方法

昇格された権限を削除する場合は以下の順序に従います。

  • (昇格された) 補助グループ権限を削除し、次に (昇格された) プライマリ グループ権限を削除します。

  • (昇格された) プライマリ グループ権限を削除し、次に (昇格された) ユーザー権限を削除します。

例 - ユーザー権限を先に削除
#define _BSD_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <stdlib.h>
#define fatal_error() abort()

static void sanitize_privilege_drop_check(uid_t olduid, gid_t oldgid)
{
    if (seteuid(olduid) != -1)
    {
        /* Privileges can be restored, handle error */
        fatal_error();
    }
    if (setegid(oldgid) != -1)
    {
        /* Privileges can be restored, handle error */
        fatal_error();
    }
}
void badprivilegedroporder(void) {
    uid_t
        newuid = getuid(),
        olduid = geteuid();
    gid_t
        newgid = getgid(),
        oldgid = getegid();

    if (setuid(newuid) == -1) {
        /* handle error condition */
        fatal_error();
    }
    if (setgid(newgid) == -1)  {  //Noncompliant
        /* handle error condition */
        fatal_error();
    }
    if (olduid == 0) {
        /* drop ancillary groups IDs only possible for root */
        if (setgroups(1, &newgid) == -1) { //Noncompliant
            /* handle error condition */
            fatal_error();
        }
    }

    sanitize_privilege_drop_check(olduid, oldgid);
}

この例では、2 つの権限を不適切な順序で削除しています。setgid はグループ権限の削除を試みます。ただし、setgid がこの関数を実行するにはユーザー権限が必要です。しかし、ユーザー権限はこれよりも前に setuid を使用して削除されています。グループ権限を削除後、この関数は setgroups を使用して補助グループ権限の削除を試みます。このタスクには setgid で削除された高い権限のプライマリ グループが必要です。権限を削除する順序が不適切なため、この関数の最後で、おそらくグループ権限を再取得することになります。

修正 - 権限を削除する順序の反転

考えられる 1 つの修正方法として、最下位レベルの権限を最初に削除します。この修正では、補助グループ権限を削除し、次にプライマリ グループ権限、最後にユーザー権限を削除します。

#define _BSD_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <stdlib.h>
#define fatal_error() abort()

static void sanitize_privilege_drop_check(uid_t olduid, gid_t oldgid)
{
    if (seteuid(olduid) != -1)
    {
        /* Privileges can be restored, handle error */
        fatal_error();
    }
    if (setegid(oldgid) != -1)
    {
        /* Privileges can be restored, handle error */
        fatal_error();
    }
}
void badprivilegedroporder(void) {
    uid_t
        newuid = getuid(),
        olduid = geteuid();
    gid_t
        newgid = getgid(),
        oldgid = getegid();

    if (olduid == 0) {
        /* drop ancillary groups IDs only possible for root */
        if (setgroups(1, &newgid) == -1) {
            /* handle error condition */
            fatal_error();
        }
    }
    if (setgid(getgid()) == -1)  {
        /* handle error condition */
        fatal_error();
    }
    if (setuid(getuid()) == -1) {
        /* handle error condition */
        fatal_error();
    }

    sanitize_privilege_drop_check(olduid, oldgid);
}

チェック情報

グループ: Rule 50.POSIX (POS)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.