セキュリティ

両毛システムズのランサムウェア被害:VPNアカウント悪用と委託元に残ったファイルの点検

両毛システムズのランサムウェア被害:VPNアカウント悪用と委託元に残ったファイルの点検

群馬県桐生市のシステム開発会社、両毛システムズは2026年9月25日の第3報で、8月12日に第三者がVPN機器のアカウントを悪用して社内ネットワークへ侵入し、ランサムウェア攻撃を受けたと公表しました。その後、大東ガス約12.4万件、伊勢崎市の児童生徒3,789件、名張近鉄ガス約6,800件、長野都市ガス約3,600件と、委託元の公表が続いています。本記事では両毛システムズの3つの報告と委託元5組織の公表文を突き合わせて範囲を整理し、委託元の本番システムは無事でも情報が漏れた構造を、点検の実装へとつなげる内容です。VPN利用者を棚卸しするPowerShell、社内に残った委託元データを洗い出すPython、委託先の通知と委託元の報告の順番までを扱います。

まとめ:両毛システムズのランサムウェア被害で確定した事実と委託先・委託元の対策

確定しているのは、8月12日にVPN機器のアカウントが悪用されて社内ネットワークへ入られ、14日未明に社内の死活監視で異常が見つかった、という点です。不正アクセスの痕跡は一部のサーバーで確認され、その中に委託元から過去に預かった顧客情報や児童生徒のアカウント情報を含むファイルが残っていました。悪用されたアカウントの種類と、認証情報が攻撃者に渡った経路は10月9日時点で公表されていません。

委託を受けるITベンダーが先に確かめるのは3点です。VPNに入れるアカウントに、退職者や使われていない保守用の口座が残っていないか。パスワードだけでVPNに入れる状態になっていないか。作業のために受け取った委託元のデータが、作業を終えた後も社内のファイルサーバーに置かれたままになっていないか。今回、委託元の本番システムへの侵入は確認されていません。漏れた可能性があるのは、ベンダーの社内に残っていたファイルです。

項目 公表されている内容
侵入 8月12日・VPN機器のアカウント悪用
検知 8月14日未明・社内の死活監視
攻撃の種類 ランサムウェア(第2報で確認)
委託元への報告 9月24日(大東ガス・伊勢崎市)
公表した委託元 5組織(うち広島ガスは漏えい未確認)
未公表 アカウントの種類・認証情報の入手経路

両毛システムズの第1報〜第3報と委託元5組織の公表を時系列で並べる

第3報で示された8月12日のVPNアカウント悪用から検知までの2日間

両毛システムズは8月15日付の第1報で、14日に社内システムへの不正アクセスを確認したと公表しました。8月19日付の第2報の時点で、すでにランサムウェアによる攻撃と確認したと書いています。ネットワークを遮断して社内システムを止め、警察と個人情報保護委員会へも報告済みでした。

侵入の日付が出たのは9月25日付の第3報です。外部の第三者がネットワーク接続機器(VPN)のアカウントを悪用して8月12日に社内へ入り、14日に死活監視で異常を検知、15日から外部専門機関のフォレンジック調査に入った経緯が示されました。侵入から検知まで2日です。漏えいのおそれがある情報には、営業情報、取引情報、取引先の顧客や従業員の個人情報が含まれるとしています。

大東ガス・伊勢崎市・名張近鉄ガス・長野都市ガス・広島ガスの影響範囲

委託元の公表は9月28日から10月5日にかけて出そろいました。同じ侵害でも、預けていたデータの時期と項目は組織ごとに違います。

委託元 公表日 委託の内容 公表された範囲
大東ガス 9月28日 顧客情報の管理システム 約124,000件(2023/11〜2024/4)
伊勢崎市 9月28日 学習者用タブレットの保守 児童生徒3,789件
名張近鉄ガス 9月30日 顧客情報の管理 約6,800件(プロパンガス顧客)
長野都市ガス 10月5日(第二報) 一部業務 約3,600件(保安調査の結果)
広島ガス 9月30日 顧客情報システムの維持管理 漏えいの事実は未確認

大東ガスの公表は氏名、住所、電話番号、お客さま番号、ガスメータ番号、ガス使用量までを対象とし、口座とカードの情報は含まないとしています。伊勢崎市の公表は学校名、学年、氏名、アカウント名に加えてパスワードを挙げました。名張近鉄ガスは氏名、住所、料金番号、長野都市ガスの第二報は2026年4月1日〜5月16日の保安調査の結果です。広島ガスは、現時点で顧客情報が漏えいした事実は確認されていないと説明しています。

委託元への漏えいに関する報告が検知から約40日後の9月24日になった経緯

伊勢崎市の公表によると、両毛システムズは8月17日の時点で「教育ネットワークへの被害はない」と市に報告していました。不正アクセスのあった社内システムに児童生徒のアカウント情報が含まれていると伝えたのは9月24日です。大東ガスも同じ9月24日に報告を受けています。

委託元のシステム自体が無事なら、初動の報告は「被害なし」になります。そのあと、侵害されたファイルサーバーの中身を調べて初めて、どの委託元のファイルが置かれていたかが分かる。今回の約40日は、この調査にかかった時間です。なお9月中旬には、ランサムウェアグループのSafePayが同社のドメインをリークサイトに載せたと報じられていますが、両毛システムズは攻撃者を公表していません。

本番システムは無事でも漏れた構造|ベンダー社内に残った委託元の作業ファイル

大東ガスの2023年11月〜2024年4月分が2026年まで社内に残った意味

大東ガスは、自社が使う顧客情報システムと両毛システムズの社内ネットワークは分離されており、そのシステムへの不正アクセスは確認されていないと書いています。漏れた可能性があるのは、過去に両社の間で業務上取り扱ったファイルが両毛システムズの社内ネットワーク内に残っていたものです。対象期間は2023年11月〜2024年4月で、公表の時点から2年以上前の顧客データでした。

システム保守の現場では、移行の検証、障害の調査、帳票の確認のために、本番データの一部をCSVなどで受け取ることがあります。作業が終わった時点で消す決まりがあっても、誰がどのフォルダに置いたかの記録がなければ、消したかどうかを後から確かめられません。本番を分離していても、持ち出した写しが残れば、分離の外で漏れます。

伊勢崎市の児童生徒3,789件にパスワードまで含まれていた保守ファイル

伊勢崎市は、小学校23校と中学校11校、四ツ葉学園のタブレット端末、校内無線ネットワーク、各種アカウントの保守と運用を両毛システムズに委託していました。漏れた可能性があるのは、アカウント名とパスワードの組です。市は保護者に通知し、該当アカウントのパスワードを変更しました。

端末の初期設定やパスワードの再発行を請け負うと、アカウント名と初期パスワードの一覧表を扱う場面が出てきます。この一覧がファイルサーバーに平文で置かれていると、ランサムウェアの攻撃者がデータを持ち出した時点で、そのままログインに使える状態の情報です。氏名や住所と違い、パスワードは変更すれば無効にできますが、それまでの間は不正ログインの入口として働きます。

VPNアカウントを棚卸しする|ADグループと最終ログオンで残った口座を洗い出す

警察庁の令和8年上半期の集計では、ランサムウェアの被害報告は123件で、感染経路の有効回答36件のうちVPN機器が18件でした。両毛システムズはアカウントの種類を明かしていないため、ここではVPN機器の認証をActive Directoryに連携している構成を例に、悪用されうる口座の洗い出し方を示します。

VPN接続許可のADグループから無効・長期未使用の利用者を抽出するPowerShell

VPN機器がRADIUSやLDAPでADのグループを見て接続を許可している場合、そのグループの所属者を並べたものが「VPNに入れる人」の一覧です。Get-ADGroupMemberは-Recursiveを付けると入れ子のグループの中まで展開し、利用者だけを返します。それをGet-ADUserに渡して、最終ログオン日などの属性を足します。

# VPN接続を許可しているADグループの利用者から、見直すべき口座を洗い出す(RSATのActiveDirectoryモジュールが必要)
Import-Module ActiveDirectory

$vpnGroup = "VPN-Users"   # VPN機器が参照しているグループ名に置き換える
$limit    = (Get-Date).AddDays(-45)

Get-ADGroupMember -Identity $vpnGroup -Recursive |
    Where-Object { $_.objectClass -eq "user" } |
    Get-ADUser -Properties LastLogonDate, PasswordLastSet, PasswordNeverExpires, Description |
    Where-Object {
        -not $_.Enabled -or
        $null -eq $_.LastLogonDate -or
        $_.LastLogonDate -lt $limit -or
        $_.PasswordNeverExpires
    } |
    Select-Object SamAccountName, Enabled, LastLogonDate, PasswordLastSet, PasswordNeverExpires, Description |
    Sort-Object LastLogonDate |
    Export-Csv -Path .\vpn_account_review.csv -NoTypeInformation -Encoding UTF8

抽出の条件は4つです。無効化済みなのにグループに残っている口座、一度もログオンしていない口座、45日以上ログオンしていない口座、パスワードを無期限にした口座。保守ベンダーの環境では、案件ごとに作った共用の保守用アカウントが最後の2つに当たりやすく、結果のCSVでDescription欄に用途が書かれていない口座から順に止めます。

最終ログオン日の最大14日の遅れを踏まえた閾値と多要素認証の要否

LastLogonDateはAD属性のlastLogonTimestampを日付に直したものです。Microsoftのスキーマ説明によると、この値はログオンのたびに書き換わるわけではなく、既定では14日から最大5日を引いた間隔でしか更新されません。30日で切ると、実際は使っている人まで拾う場合があります。45日なら、この遅れを吸収したうえで、四半期に一度しか使わない口座を拾えます。

棚卸しで口座を減らしても、残った口座がパスワードだけで入れるなら、パスワードが漏れた時点で同じことが起きます。VPNの認証にはワンタイムパスワードや証明書を組み合わせた多要素認証の方式を掛けてください。VPN機器そのものの既知の脆弱性をどの順で直すかはデジタル庁GSSのVPN脆弱性の優先度付けで扱っています。

委託元データの残置を洗い出す|委託元フォルダ別に個人データとパスワード列を検出

保持日数を過ぎた作業ファイルから氏名・電話番号・パスワード列を探すPython

次の例は、ファイルサーバーの委託元ごとのフォルダを順に見て、保持日数を過ぎたCSV、TSV、テキスト、Excelファイルのうち、個人情報やパスワードの列を持つものを一覧にします。標準ライブラリのcsvで見出し行を読み、Excelはzipfileで中の文字列を取り出すため、追加のライブラリは要りません。

# ファイルサーバーに残った委託元の個人データを、委託元フォルダごとに洗い出す(Python 3.9以上・標準ライブラリのみ)
import csv
import re
import sys
import time
import zipfile
from pathlib import Path

PII_HEADERS = ("氏名", "住所", "電話", "生年月日", "お客さま番号", "顧客番号", "メール")
SECRET_HEADERS = ("パスワード", "password", "passwd", "pwd")
PHONE = re.compile(r"0\d{1,4}-\d{1,4}-\d{3,4}")
TARGET_EXT = {".csv", ".tsv", ".txt", ".xlsx"}

def read_text(path: Path) -> str:
    if path.suffix.lower() == ".xlsx":
        with zipfile.ZipFile(path) as z:
            names = [n for n in z.namelist() if n == "xl/sharedStrings.xml" or n.startswith("xl/worksheets/")]
            return " ".join(z.read(n).decode("utf-8", "replace") for n in names)
    raw = path.read_bytes()[:200_000]
    for enc in ("utf-8-sig", "cp932"):
        try:
            return raw.decode(enc)
        except UnicodeDecodeError:
            continue
    return raw.decode("utf-8", "replace")

def header_of(path: Path, text: str) -> list[str]:
    if path.suffix.lower() in (".csv", ".tsv"):
        delim = "\t" if path.suffix.lower() == ".tsv" else ","
        first = next(csv.reader(text.splitlines(), delimiter=delim), [])
        return [c.strip().lower() for c in first]
    return [text.lower()]

def inspect(path: Path) -> list[str]:
    try:
        text = read_text(path)
    except (OSError, zipfile.BadZipFile) as e:
        return [f"読み取り不可({type(e).__name__})"]
    cols = header_of(path, text)
    reasons = []
    if any(s in c for c in cols for s in SECRET_HEADERS):
        reasons.append("★パスワード列")
    pii = sorted({h for h in PII_HEADERS if any(h in c for c in cols)})
    if pii:
        reasons.append("個人情報列:" + "・".join(pii))
    phones = len(PHONE.findall(text))
    if phones:
        reasons.append(f"電話番号{phones}件")
    return reasons

def scan(root: Path, keep_days: int) -> int:
    now = time.time()
    hits = 0
    for client in sorted(p for p in root.iterdir() if p.is_dir()):
        for path in sorted(client.rglob("*")):
            if not path.is_file() or path.suffix.lower() not in TARGET_EXT:
                continue
            age = int((now - path.stat().st_mtime) // 86400)
            if age < keep_days:
                continue
            reasons = inspect(path)
            if reasons:
                hits += 1
                print(f"[{client.name}] {age}日経過 {path.relative_to(root)}: {'/'.join(reasons)}")
    return hits

if __name__ == "__main__":
    root = Path(sys.argv[1])
    keep_days = int(sys.argv[2]) if len(sys.argv) > 2 else 90
    sys.exit(1 if scan(root, keep_days) else 0)

模擬の委託元3フォルダで実行した検出結果と委託元別の削除記録への載せ方

委託元を模した3つのフォルダに4ファイルを置き、python residual_scan.py 共有フォルダのパス 0で実行した結果です。保持日数を0にして全ファイルを対象にしています。

[city_b] 0日経過 city_b\tablet\accounts.csv: ★パスワード列/個人情報列:氏名
[gas_a] 0日経過 gas_a\migration\kokyaku_202311.csv: 個人情報列:お客さま番号・住所・氏名・電話/電話番号2件
[gas_c] 0日経過 gas_c\hoan\chosa_kekka.tsv: 電話番号1件

パスワード列を持つアカウント一覧、顧客台帳、本文に電話番号が書かれた調査結果の3件が委託元名付きで出て、個人情報を含まない手順書は通過しました。検出があると終了コードが1になるため、タスクスケジューラなどから週次で回して通知に使えます。保持日数を90にすると、作成直後のファイルは対象外になり終了コードは0でした。

見つけたファイルは、委託元に返すか消すかを決め、その日付と担当者を委託元ごとの台帳に残します。台帳があれば、侵害が起きたときに「どの委託元のファイルが、どのサーバーに、いつまであったか」を数日で答えられます。この台帳は、今回のような約40日の調査期間を縮めるための材料です。

委託元のデータを社内に持ち帰らない判断|作業コピーを置く条件と置かない条件

個人データの作業コピーを社内ファイルサーバーに置かないと決める条件

判断は言い切れます。委託元の顧客の氏名と連絡先、または児童生徒や利用者のログイン情報を扱う作業なら、作業コピーを自社のファイルサーバーに置きません。作業は委託元の環境の中で、委託元が用意した端末や画面共有で行います。今回の大東ガスと伊勢崎市の範囲は、どちらもこの持ち帰りで生まれています。

持ち帰りが避けられないのは、委託元の環境に検証用の機器を置けない移行作業などに限ります。その場合は、委託元ごとに分けた暗号化領域に置き、作業終了日に削除して台帳へ記録するまでを1つの作業として見積もります。反対に、項目を伏せた件数や統計しか扱わない分析作業なら、ここまでの管理は過剰です。

VPN機器を残すか更改するかを分ける多要素認証の可否と接続先の絞り込み

VPN機器が多要素認証に対応していない、またはサポートが終わって修正が出ない場合は、機器の更改を先に決めます。棚卸しと閾値の見直しだけでは、残った正規の口座が悪用される経路を消せないからです。

多要素認証が掛けられる機器なら、VPNは残してかまいません。そのうえで、VPNで入った後に届くサーバーを業務ごとに絞ります。保守担当者のVPN接続から全社のファイルサーバーへ届く構成をやめ、必要なサーバーだけへ通す考え方はゼロトラストネットワーク(ZTNA)とVPNの違いで整理しています。侵入後のファイルサーバーへのアクセスを後から追うためのログの見方は不正アクセスのログ確認・解析方法にまとめました。

委託先の通知と委託元の報告の順番|法26条ただし書と速報3〜5日の起点

委託先が委託元へ通知すれば委員会報告を免れる規定と委託元の速報期限

個人情報保護法26条1項は、漏えい等が起きたとき個人情報保護委員会への報告を義務付けています。ただし書により、委託を受けた事業者が委託元にその事態を通知したときは、委託先は報告義務を負いません。報告と本人への通知の主体は原則として委託元です。長野都市ガスは、対象の顧客への書面通知を26条2項に基づくものと明記しています。

個人情報保護委員会の案内では、速報は事態を知った日から3〜5日以内、確報は30日以内、不正の目的によるおそれがある場合は60日以内です。委託元にとって、速報期限を数える起点は、委託先から通知を受けた日です。大東ガスと伊勢崎市の場合、起点は9月24日で、28日にはそれぞれ公表しています。報告書式の段取りは個人情報保護委員会への報告義務の実務で解説しています。

委託元が委託契約と委託先台帳で確かめる返却・削除と再委託の記録

個人情報保護委員会の通則編ガイドラインは、3-4-4「委託先の監督」で、適切な委託先の選定、委託契約の締結、委託先での取扱状況の把握の3つを求めています。委託元が今回の件から確かめるのは、契約に作業終了後の返却と削除の期限、削除したことの報告が入っているか、そして委託先が受け取ったデータの一覧を出せるかです。

委託元の側で送るデータそのものを減らす設計は大和証券の事例での委託先に残さない設計で、委託先を起点にした攻撃の型の全体はサプライチェーン攻撃とはで扱っています。委託先の文書管理に置かれた顧客の認証情報が漏えいした例は、ユニリタの不正アクセスと顧客の認証情報を回す手順で扱っています。VPNの口座管理、保守用アカウントの権限、ファイルサーバーに残ったデータまでを第三者の目で確かめるなら、脆弱性診断・セキュリティ診断で外部からの入口と社内の権限をあわせて点検できます。

よくある質問

両毛システムズのランサムウェア被害について、委託元の利用者とシステムの担当者から出やすい質問をまとめました。

両毛システムズのランサムウェア被害でどの組織が影響を受けましたか?

10月9日時点で公表しているのは、大東ガス(約124,000件)、伊勢崎市(児童生徒3,789件)、名張近鉄ガス(約6,800件)、長野都市ガス(約3,600件)、広島ガスの5組織です。広島ガスは、現時点で顧客情報の漏えいは確認されていないとしています。両毛システムズ自身も、取引先の顧客、問い合わせをした事業者、個人の顧客、従業員の情報が含まれる可能性があるとして、件数と項目を精査中です。

侵入経路は何だったのですか?

両毛システムズの第3報によると、8月12日に外部の第三者がネットワーク接続機器(VPN)のアカウントを悪用して社内ネットワークへ侵入しました。伊勢崎市の公表も、VPNから社内ネットワークに入られ、一部のファイルサーバーにアクセスされたとの報告を受けたと書いています。悪用されたアカウントの種類や、認証情報が攻撃者に渡った経路は公表されていません。

ガス会社のシステムが直接攻撃されたのですか?

大東ガスは、自社の顧客情報システムと両毛システムズの社内ネットワークは分離されており、そのシステムへの不正アクセスや情報流出は確認されていないと説明しています。漏れた可能性があるのは、過去の業務で両社の間で取り扱い、両毛システムズの社内に残っていたファイルです。名張近鉄ガスと長野都市ガスも、委託先のファイルサーバーへの不正アクセスとしています。

自分の情報が含まれているか確かめる方法はありますか?

対象となる方には、各委託元から個別に連絡すると公表されています。長野都市ガスは10月5日以降に書面を順次発送するとしています。不明な点の問い合わせ先は、各社の窓口か、両毛システムズの専用コールセンターです。委託元や両毛システムズを装った電話やメールで口座番号や暗証番号を聞かれても答えず、公式サイトから窓口をたどってください。

保守を外部に委託している企業はまず何を確認すればよいですか?

委託先に、これまでに渡したデータの一覧と、それぞれが返却または削除済みかを問い合わせます。今回、大東ガスの対象は2年以上前のデータでした。次に、委託先が自社の環境へ入るときの接続方法と、その接続に多要素認証が掛かっているかを確かめます。契約に返却と削除の期限が無ければ、次の更新で追加します。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.08 テックブログ 大阪公立大学のランサムウェア被害と仮想化基盤の停止|全授業休講に至った経緯とバックアップを守る設定
  2. 2026.10.09 テックブログ IDCFクラウドの不正アクセスとランサムウェア被害|利用者の初動と別基盤への復旧手順
  3. 2024.11.08 テックブログ OpenAPI GeneratorでJavaコードを自動生成する方法|CLI導入からSpring・ライブラリ選択まで
  4. 2026.10.09 テックブログ ニッスイのサイバー攻撃で日水物流の入出荷停止|委託先クラウド障害に荷主が備える手順
  5. 2026.10.09 テックブログ 京王電鉄のランサムウェア被害とグループ共通基盤:決済・ポイント・予約が止まった範囲と遮断の初動

RELATED POSTS 関連記事

目次