Midnight Monologues

日々勉強したことを書いてきます

「EUがAI規制を延期した」は半分ウソ——Digital Omnibusで実際に何が動いて、何が動かなかったのか

「EUがAI規制を延期したらしい」——2026年に入ってから、こんな話を耳にした方は多いと思います。結論から言うと、この見出しは半分だけ正しく、半分は危険なほど不正確です。

延期されたものは確かにあります。しかし、予定通り2026年8月2日にやってくる義務も残っている。にもかかわらず「全部2027年に延びた」と受け取って準備を止めてしまうと、直近の締切を踏み抜くことになります。

この記事では、2026年7月に正式成立した「Digital Omnibus on AI(AIに関するデジタル・オムニバス)」によって、EU AI Actの何が動いて、何が動かなかったのかを、実務者の視点で整理します。そして最後に、AWS等でシステムを設計する立場から見た「透明性義務は制度論ではなくエンジニアリング課題である」という論点にも触れます。(※本記事は2026年7月20日時点の情報です。)

【3分でわかる本記事の要点】

  • 高リスクAI義務は延期:Annex IIIは2027年12月、Annex Iは2028年8月へ後ろ倒し。
  • 透明性義務(第50条)は延期なし:チャットボット告知やAI表示は2026年8月2日から順次適用(既存システムは12月2日)。
  • 結論:法務の確認だけでなく、透明性マーキングをエンジニアリングのバックログに組み込む対応が急務。

※ 注記:本記事は一般的な解説であり、法的助言ではありません。個別の対応は一次情報を確認のうえで判断してください。

そもそもDigital Omnibusとは

Digital Omnibusは、欧州委員会が2025年11月19日に提案した、EU AI Actへの初めての本格的な改正パッケージです。実装に必要な整合規格や当局体制の整備が間に合わない、という現実的な事情を背景に、一部義務の適用時期を後ろ倒しするのが柱でした。

その後、2026年5月7日に暫定的な政治合意に至り、欧州議会が6月16日に、理事会が6月29日に採択。7月に発効という流れで確定しています。

重要なのは、AI Actの土台(リスクベースの分類、禁止行為、汎用AIモデルのルール)は変わっていないという点です。禁止行為は2025年2月、汎用AI(GPAI)の義務は2025年8月に、それぞれ予定通り適用済み。今回動いたのは、あくまで「高リスクAIシステム」の適用時期と、いくつかの追加・修正です。

動いた締切/動かなかった締切

対象 従来の期日 改正後の期日 動いたかどうか
高リスク・Annex III(単独型) 2026年8月2日 2027年12月2日 延期
高リスク・Annex I(製品組込型) 2027年8月2日 2028年8月2日 延期
第50条 透明性義務(チャットボット告知・ディープフェイク表示など) 2026年8月2日 2026年8月2日(据え置き) 動かず
第50条(2) AI生成物のマーキング(市場投入済みの既存システム) 2026年8月2日 2026年12月2日(猶予) 一部緩和
新設:ヌーディファイア等(NCII/CSAM)の禁止 2026年12月2日 新規追加

ポイントは、8月2日という一つの日付が、「そのまま生きている義務」と「1年以上先へ滑った義務」に割れたことです。ここを混同すると事故ります。

動いたもの - 高リスクは2027〜2028年へ

多くの人が「2026年8月2日の締切」と呼んでいたのは、実はこの高リスクAIシステムの義務のことでした。そしてこれこそが、今回はっきり動いた部分です。

  • Annex III(単独型の高リスク):雇用、教育、重要インフラ、法執行、信用スコアリングなど。→ 2027年12月2日へ(約16〜17か月の延長)
  • Annex I(規制対象製品に組み込まれる高リスク):医療機器や機械類などに組み込まれるAI。→ 2028年8月2日へ

背景は「厳しくしたくないから」ではなく、適合性評価に必要な整合規格や当局・データベースの整備が間に合わなかったという実務上の理由です。しかも今回の延期は単純な先送りではなく、AI Officeが立ち上げる高リスク登録データベースへの登録・準備の仕組みと紐づいた「構造化された延期」である点に注意が要ります。加えて、期日前に市場投入済みのシステムは、実質的な変更を加えない限り高リスク義務を免れる——いわゆるグランドファザリング(既存不適格)条項も入りました。裏を返せば、大きく作り替えた瞬間に義務が復活するということです。

動かなかったもの - 第50条の透明性義務

そして本題です。第50条の透明性義務は延期されていません。予定通り2026年8月2日に適用されます。

第50条は、みなさんが「AI規制」と聞いて思い浮かべるリスクピラミッド(禁止/高リスク/限定リスク/最小リスク)の外側にあります。問うのは「そのシステムは高リスクか」ではなく、「人が、それと知らずにAIに接していないか」です。答えがイエスなら透明性義務がかかる。主に次のような場面が対象です。

  • 人と直接対話するAI(チャットボット、音声アシスタント等)は、相手が機械であることを利用者に知らせる
  • AIが生成・加工した音声・画像・動画・テキストは、機械可読な形で「AI生成」と分かるようマーキングする
  • ディープフェイク(実在の人物・場所を模した合成コンテンツ)はその旨を開示する

ひとつだけ猶予があります。第50条(2)の生成物マーキングについて、2026年8月2日より前に市場に出ていた既存システムは、2026年12月2日まで対応が猶予されます。新規に市場投入するものは8月2日から即適用です。

つまり実務上は、告知系の義務が2026年8月2日既存の生成系システムのマーキングが2026年12月2日という二段構えになります。これはオムニバスが与えた恩恵ではなく、もともとの時間割にそう書かれていた構造です。「延期」の一言で片付けて緩めると、短い滑走路を踏み外します。

プロダクトの現場で一番迷うのは「自社の機能がどちらに入るか」です。目線を合わせるために例を挙げます。

  • 2026年8月2日〜(新規適用):8月2日以降に新規リリース、またはメジャーアップデートするチャットボットや画像生成機能。
  • 2026年12月2日〜(猶予終了):8月2日より前から既に稼働している既存サービスのAI生成物マーキング。

線引きの起点は「そのシステムが8月2日時点で市場に出ていたか」「その後に実質的な変更を加えたか」です。稼働中でも大きく作り替えれば新規扱いに寄る、という点は棚卸しの際に必ず確認してください。

新しく増えたもの

延期だけでなく、追加された規制もあります。

  • ヌーディファイア等の禁止:非同意の性的画像(NCII)や児童性的虐待コンテンツ(CSAM)を生成するAIの禁止が、第5条(禁止行為)に新設。2026年12月2日に適用。
  • AI Officeの監督権限の強化:垂直統合型のAIプロバイダに対する監督が広がりました。
  • GDPRとの関係整理:バイアス検出などの限定的な文脈で、特別カテゴリを含む個人データをAI開発に用いる余地が整理されました(相応のセーフガード付き)。
  • SME向け閾値の緩和:中小事業者の負担に配慮した調整も入っています。

見落とされがちですが、Digital Omnibusは単なる「期日の繰り延べ」ではなく、事業者の負担を減らす「簡素化(Simplification)」パッケージでもあります。とりわけGDPRとの整合性が整理され、バイアス検出等でのデータ利用の法的根拠が明確化された点は、規制対応の文脈で語られがちなAI Actにおいて、開発企業にとってはむしろ追い風と言える部分です。締切と禁止事項だけでなく、こうした「使いやすくなった箇所」も併せて押さえておくと、社内での説明の説得力が変わります。

今、コンプラ計画のどこを書き換えるか

「延期=一息つける」ではありません。むしろ、手を動かす締切が近い方から並べ直すのが正解です。優先順位はおおむねこうなります。

  1. AIシステムの棚卸し:自社が提供・利用するAIを洗い出し、それぞれが「透明性(第50条)」「高リスク(Annex III/I)」「禁止行為」のどれに当たるかを分類する。ここが全ての起点です。
  2. 2026年8月2日に向けた透明性対応:チャットボットの告知、生成物のマーキング、ディープフェイク表示。新規システムはこの日から。
  3. 2026年12月2日に向けた対応:既存の生成系システムのマーキング、そしてヌーディファイア禁止への抵触チェック。
  4. 高リスク対応(2027/2028年)は「余裕」ではなく「準備期間」:適合性評価やドキュメンテーション体制の構築には時間がかかります。延びた分は前倒しで着手する。

2026年7月より前に公開された「AI Act 2026」系の解説記事の多くは、すでに存在しない法状況を前提にしています。古い資料を鵜呑みにしないこと。

透明性義務は「制度論」ではなく「エンジニアリング課題」

ここが、この記事で一番伝えたい点です。第50条の透明性義務、とりわけ生成物のマーキングは、法務の話に見えて、実態はエンジニアリングの設計問題です。

「AI生成コンテンツに機械可読なマーカーを埋め込む」と一文で書くのは簡単ですが、そのマーカーはコピー・圧縮・再アップロードを経てもプラットフォームを跨いで生き残る必要があります。ここで問われるのは、ウォーターマーク方式の選定、来歴メタデータ(プロベナンス、C2PA等)の設計、そして検出ツールの運用です。生成パイプラインのどこでマーキングを施し、配信・保存の過程でどう保持するか——これはアーキテクチャの意思決定そのものです。

クラウド上で生成系のワークロードを組む立場から見ると、透明性義務は「ポリシー文書を1枚足す」話ではなく、生成→保存→配信の各層に責務を割り付ける設計課題として捉えるべきものです。制度の締切(2026年8月2日/12月2日)を、そのまま実装バックログの期日として扱う。この翻訳ができるかどうかが、コンプラ担当とエンジニアの間で最も落ちやすいボールだと感じています。

まとめ

  • 「EUがAI規制を延期した」は半分ウソ。割れたが正確。
  • 動いたもの - 高リスク(Annex III → 2027年12月2日、Annex I → 2028年8月2日)。
  • 動かなかったもの - 第50条の透明性義務は2026年8月2日に予定通り適用。生成物マーキングの既存システム分は2026年12月2日まで猶予。
  • 増えたもの - ヌーディファイア等の禁止(2026年12月2日)、AI Officeの権限強化ほか。
  • 直近でやるべきは、AIシステムの棚卸しと、8月・12月の透明性対応。高リスクの猶予は「準備期間」と捉える。

そして忘れてはいけないのが、透明性義務は法務だけの仕事ではないということ。締切をエンジニアリングのバックログに翻訳できる人が、これからのAIガバナンスでは強いとされます。


本記事は一般的な情報提供であり、法的助言ではありません。適用の可否や具体的対応は、EUR-LexのRegulation (EU) 2024/1689および改正オムニバスの一次テキスト、AI Officeの公表資料等をご確認ください。

参考文献

1.EU AI Act 規則本文(EUR-Lex)
・欧州連合官報(Official Journal of the European Union)本文(英語)
https://eur-lex.europa.eu/eli/reg/2024/1689/oj/eng
→EU AI Actの公式条文全文(第1条〜第113条および各附属書 Annex I〜XIII)を閲覧・ダウンロードできます。

・規則の公式要約ページ(EUR-Lex Legal Summary)
https://eur-lex.europa.eu/legal-content/CA/LSU/?uri=oj%3AL_202401689
→AI Actの全体像や目的、リスク分類のポイントが簡潔にまとめられています。

2.欧州AIオフィス(European AI Office)公式ポータル
・AI Office 公式ページ(欧州委員会)
European AI Office | Shaping Europe’s digital future
→AI Officeによるガイダンス文書、プレスリリース、GPAI(汎用AI)に関するコード・オブ・コンダクトや標準化活動の最新発表資料が掲載されています。

CISM 合格体験記

先日CISMというマネジメント系のセキュリティ資格の試験にCISA試験に続いて合格しました。いつもの通り受験勉強の間、様々な方の合格体験記を読みながら参考にしたこともあり、後学の受験者のために記録を残しておきます。

CISM(Certified Information Security Manager)について

公認情報セキュリティマネージャー(CISM)とは、アメリカ合衆国非営利団体であるISACAによって認定される情報セキュリティの国際標準資格です。
試験はCBT形式で実施され、4時間(240分)で150問を解く形式です。出題範囲は4つのドメインから出題されます。(2025年8月9日現在)
ドメイン 1 – 情報セキュリティガバナンス(17%)
ドメイン 2 – 情報リスクの管理(20%)
ドメイン 3 – 情報セキュリティプログラムの開発と管理(33%)
ドメイン 4 – 情報セキュリティのインシデントの管理(30%)

受験の前提

私のステータス

 JTCのシステムエンジニアとして、インフラ領域のシステム提案・設計・構築を担当しています。
 RISS(登録)、CISSPCISA、CEHなどの資格を取得しており、セキュリティ技術については一定の知識があります。
 現在は管理職ではありませんが、マネジメント層へのシフトと経営管理層の思考法を学ぶことを目的としています。
 事前にCISA試験には合格しており、ISACAの考え方をある程度理解した上での受験でした。

 CISMの各ドメインと自身のスキルマップの関連性は以下のような状況です。
 (★4つ判定で、★が多いほど関連あり。)
 1.情報セキュリティガバナンス (★☆☆☆)
 2.情報リスクの管理 (★★★☆)
 3.情報セキュリティプログラムの開発と管理 (★★☆☆)
 4.情報セキュリティのインシデントの管理 (★★★★)

学習にあたっての傾向分析

👦インフラ領域のシステムエンジニアの場合👧
 【得意分野】
 顧客提案で災対環境整備やバックアップ設計を行うため、ドメイン4は前提知識がありました。
 CISA試験の勉強をしていたこともあり、他ドメインもある程度の知識はありました。
 【不得意分野】
 ガバナンス系の業務よりは現場目線での業務が多いため、ドメイン1は不得意な傾向がありました。

受験の動機

😀 経営層目線の視点を学ぶため
 職位や年齢の上昇に伴い、現場の技術職から事務系の管理職へと、徐々に業務内容がシフトしています。
 セキュリティとマネジメントを掛け合わせた視点を学ぶことで、経営層が求めるマネジメント職の役割を理解することを目標としました。
😀AI技術に代替されないエンジニアを目指すため
 最近、CTFをやりながら強く感じているのは、初級〜中級程度の問題であれば、生成AIで解けてしまうほど、その進化が恐ろしいレベルに達しているということです。将来的には、現場レベルの単純業務の大半が生成AIに置き換わるだろうと漠然と考えています。
エンジニアとしての今後の方向性は、大きく次の2つに集約されると感じています。
 ①会社の経営層に近いマネジメント業務に特化する
 ②生成AIでも置き換えられない高度な技術に対応する業務に就く
 私はトップエンジニアほど先端技術に精通していないため、①を選択することを生存戦略としました。

勉強について

勉強期間

 2025年2月~2025年8月(6か月)

CISA資格を取得してからすぐに受験しても良かったのですが、業務多忙により時間が取れませんでした。 CISA資格を取得済みであれば2か月程度で問題ないと思います。

使用した教材

受験にあたり、専門学校は利用せずに独学でのぞみました。
(★4つ判定で、★が多いほどおすすめ。)

① CISM Questions, Answers & Explanations Database - Japanese (★★★☆)

ISACAから提供されている1,000問前後の問題集になります。 この問題集の問題を解きながら、不明な用語や考え方を整理していきます。 時々日本語訳がおかしい点があるのは、他の受験者の方も記載の通りです。

② CISM試験レビューコース (★★★★)

ISACA東京支部で、3か月ごとに開催されている2日間の勉強会です。
このレビューコースを受講すると、試験の難易度が明らかに変わるため、必ず1回は受けることをおすすめします。
講習内容は毎回ほぼ同じですが、「こんなん、なんぼあっても良いですからね」という言葉の通り、知識定着のためには何回受けても損はありません。
ISACAとしての考え方を理解するうえで、非常に役立つ内容だと思います。

学習方法

以下の流れで問題集を2週しています。 いつものことながら、最初の1週目が最も時間がかかります。
しかし、2週目・3週目になると解くスピードが上がり、1週目ほどの時間は必要ありません。
1週目を終えるとぐっと楽になるため、まずは多少雑でも構わないので最後まで解き切り、問題全体の流れを把握しましょう。

問題集のカテゴリ毎の演習(1週&2週目)

期間:2025年2月~6月(4か月)
この期間は、各カテゴリごとに問題を解き進めました。
一度解いた問題は、問題集からExcelに書き写しながら振り返りも実施。
さらに、問題集付属のFlashCard(用語集)も書き写し、不明な用語が残らないようにしました。
解き始めの段階だったこともあり、得点率は69%前後で推移していました。
※この間に、3月と6月のCISM試験レビューコースを受講しています。

問題集のテスト演習(1週目)

期間:2025年7月(1か月)
問題集に用意されている2回分の練習問題(テスト演習)を実施しました。
問題は各カテゴリで出題された問題が150問分抽出されて、出題されます。
85%以上が受験の目安ですが、76%で勉強不足でした。

問題集のテスト演習(2週目)

期間:2025年8月(数日)
問題集の練習問題をリセットして再度2回分の問題を解きました。
知識定着を目標として、繰り返し解くことを心掛けました。

問題集のテスト演習(3週目)

期間:2025年8月(テスト日当日)
問題集の練習問題をリセットし、再度2回分の問題を解きました。
答えを覚えるほど繰り返し取り組み、正答率が9割を超えるまで練習を続けました。
CISA試験の際は正答率78%前後で本番に臨みましたが、合格スコアはかなりギリギリでした。
その経験から、CISM試験では500点以上の取得を目標とし、試験の試行回数を増やして取り組みました。

受験当日

受験開始まで

当日の受験は午後からの試験でした。
午前中にいつもの試験会場(航空会館)へ行き、空き時間は隣のビルのカフェで最後の振り返りを実施していました。

受験開始~終了まで

試験問題は他の方の記載にもある通り記載できませんが、CISA試験と比較して概念的な内容が多く、難しい印象でした。
試験自体は3時間程度で解き終わりましたが、自信のないチェックを付けた問題が多く、見直しをしていたら4時間が経過していました。

受験終了後

試験後、いくつかの試験環境や受験手続に関するアンケートに回答しました。
その後、暫定の試験結果を表示するロード画面がぐるぐると回り続ける中、「受かってくれ〜」と祈りながらモニターを見つめていました。
モニターで合格の表示を確認し、試験官と一緒に再確認して試験は終了。
体感的には想定より難しく、試験中は「もしかしたら落ちるかも」と覚悟していたので、結果を見て本当に安心しました。

受験後の感想

私自身はPMPを未取得ですが、PMPがプロジェクトマネージャー向けのマネジメント資格だとすれば、CISMはセキュリティ分野に特化したマネジメント資格といえます。
PMPを取得している上司と話した際、学ぶ内容がPMPとかなり近いことを確認できたため、最終的には目指す方向は同じだと感じました。

最後に

・最後までお読み頂き、有難うございました。CISM受験へ少しでもご参考になれば幸いです。
・今後の予定ですが、CSSPを取るか秋の情報処理試験でシステム監査技術者試験を目指そうと思います。
・いつも真摯にためになる講義を提供いただくCISMレビューコースの講師の方々へは改めてお礼申し上げます。

サイバー防衛シンポジウム熱海2025 参加記

2025年6月21日~22日開催のサイバー防衛シンポジウム熱海2025(5thBF)に初参加しました。
参加予定だがどのような内容かわからなくて躊躇している方を後押しできるように参加記を残します。

本記事は1日目の参加後に、ホテルで酒を飲みながら書いています。
2日目は明日以降に気が向いたら追記予定です !!
☛ 追記しました。

参加経緯

来年以降はセキュリティの自己啓発活動が制限される予定のため

 嫁が妊娠中で家族が増える予定です。
 「一身独立して一家独立し、一国独立す」ではないですが、
 自分の家族を守れるように時間を割く必要が出てきたため、
 今自分にできる最大限のセキュリティ活動の自己啓発活動に挑戦しようと思いました。
 自分の家族も守れないものが企業体のセキュリティを守ることなど到底不可能と思います。

参加準備

チケットの申し込み

 チケット申し込みはPassMarketから行います。
 2025年度は以下のスケジュールでした。
  第一次募集:4月21日(月)12:30 ~
  第二次募集:4月25日(金)19:00 ~
  第三次募集:4月26日(土)12:30 ~

申し込み開始から10分以内には売り切れることが多く、争奪戦になります
事前にPassMarketの準備を済ませた上ですぐに支払いまで完了できるようにしましょう。

チケットの申し込みは以下の2つがあります。
 現地参加チケット
 意見交換会参加チケット

可能であれば、両方のチケットを申し込まれることを強くお勧めします
セッションをただ受動的に聴講するだけでなく、その内容を意見交換会でアウトプットすることで、
自身の理解を深め、より確実に定着させることができます。
インプットとアウトプットを組み合わせることで、学びの効果が格段に高まります。

ホテルの予約

チケットの申し込みが完了したら、できるだけ早めにホテルの予約も行いましょう。
熱海は宿泊施設が豊富ではありますが、直前になると満室になることも多く、希望の宿を確保できない可能性があります。
(私が宿泊したホテルも、大学生や海外からの旅行者が多く、当日の空室はごくわずかでした。)

参加当日

2024年のサイバー防衛シンポジウム熱海では台風の影響で現地開催が中止になったそうです。
2025年は快晴で絶好のシンポジウム日和でした。

熱海駅へ集合!!
熱海駅から出ると足湯の場所が駅前にあり、温泉地に来たことを実感します。
足湯(家康の湯)

今年は熱海後楽園ホテルでの開催です。
無料の送迎バスがJR熱海駅から定期的に運行しているので積極的に利用しましょう。
(徒歩では結構距離があるので、バス利用がおススメです。)

案内スタッフの方もいるので迷うことは少ないと思います。

熱海後楽園ホテルの外観

シンポジウムは12時半~ですが熱海駅周辺でお昼を食べる場所が以外に見つからないです。
スタバやBECK'S COFFEEなどのカフェやマクドナルドはあるが昼時は混みます。
定食屋はさらに混んでいます。
事前に食べていくか、昼食時間込みで早めにいって準備するとよいです。

☛point お昼ご飯の時間を忘れずに!!


後楽園ホテル周辺はコンビニは無いので、駅前のファミマでお茶などを買い込みました。
一番近いのはサンミ俱楽部(ホテル)内のサンミマートになります。(※若干割高です。)


☛point 駅前のコンビニで必要なものは買いましょう

サイバー防衛シンポジウム熱海2025の受付
 

プログラムについて

お昼の各プログラムはどれも普段の業務では伺えないような素晴らしい内容ばかりでした。
残念ながら場内撮影禁止 and 資料共有禁止の制約があるため、詳細は書けません。
休憩時間には講演会場の隣のフロアにある協賛企業ブースへ行きました。
各社様の製品紹介を伺いながらたくさんのグッズをいただきました。
ISC2さんの熊のぬいぐるみはちいさなお子さんのいるかたには嬉しいおみやげですね!!

サイバー防衛シンポジウム熱海2025のお土産①

サイバー防衛シンポジウム熱海2025のお土産②

意見交換会は立食形式で、名刺交換をしながら食事をいただくスタイルでした。
セキュリティの悩みや、AIなどの先端技術の活用状況について、さまざまな方と率直に意見を交わすことができました。
私もどちらかというと人付き合いが得意ではないのですが、思った以上に気軽に会話ができて、とても有意義な時間になりました。
こうした機会には、ぜひ前向きに参加することをおすすめします。

ナイトセッションでは、お酒を楽しみながら着席形式で講義を聴講することができます。
リラックスした和やかな雰囲気の中で進行しますが、発表内容は非常に重厚で、各セッションに明確なテーマと深みがありました。
カジュアルさと真剣さが絶妙に両立された、印象的なプログラムでした。

2日目もパネルディスカッションや特別講演などのプログラムが開催されました。
1日目と同様に重厚なテーマで非常に興味深い内容のテーマが多い印象でした。

最後に

民間では得られない貴重な知見を得ることができ、非常に有意義なシンポジウムでした。
もし会社の同僚から「参加すべきか」と問われたら、
迷わず「ぜひ参加すべき」と自信を持って勧めたいと思います。

ナイトセッションのときに警察関係者の方から教えていただいた白浜シンポジウム(こちらはサイバー犯罪がメイン)もタイミングが合えば参加したいと思いました。

ホテルからの風景①

レトロな郵便ポスト

ホテルからの風景②

全体を通して、官民問わず課題の根幹部分は共通点が多いと感じました。
日本の縦割り構造に見られるような部門間の分断は、海外でも「サイロ構造」として同様の問題を引き起こしており、組織運営や情報連携の妨げとなっています。 AIが発展したとしても、人間が組織を運営する限り、こうした構造的な課題は完全には解消されないのではないかと思います。

最終的には、たとえ意見が対立する場面があったとしても、相互に信頼し合いながら対話を重ねていくことが、問題解決の道となるでしょう。
こうした信頼関係の構築は、AIには代替できない、人間ならではの力だと改めて感じました。


心を一つに

TsukuCTF 2025 - Writeup

May 3-4, 2025 JSTに開催された初心者向けのTsukuCTF 2025 にチームで参加した。
自分で解けた問題のWriteupを記載する。

OSINT

curve

これは日本の有名な場所の一部です。あなたはこの写真の違和感に気づけますか?
フラグはこの場所のWebサイトのドメインです。
例: TsukuCTF25{example.com}



curveの掛かったエスカレーターでグーグル検索すると、横浜のランドマークタワーのらせんなエスカレーターであることがわかる。

参考 ameblo.jp

flag : TsukuCTF25{www.yokohama-landmark.jp}



Casca

海が綺麗なこの日本の街は、かつてポルトガルのリゾート地との交流がありました。
この写真のすぐ右側にはその記念碑が置かれています。記念碑に書かれている「式典の開催日」を答えてください。
Format: TsukuCTF25{YYYY/MM/DD}


ブラウザの画像検索で調べると熱海市ポルトガルのcascaisの姉妹都市提携に関連する話とわかる。
以下のサイトのレリーフが調べる式典の日付になる。

参考 blog.goo.ne.jp

flag : TsukuCTF25{2014/06/06}



schnee

素敵な雪山に辿り着いた!スノーボードをレンタルをして、いざ滑走!
フラグフォーマットは写真の場所の座標の小数点第4位を四捨五入して、小数第3位までをTsukuCTF25{緯度_経度}の形式で記載してください。
例: TsukuCTF25{12.345_123.456}


yandexで調べるとスイスのグリンデルヴァルト付近であることがわかる。
(画像の中にスイスの国旗があることからも裏付けが取れる。)

写真の中のスキーのレンタルショップの名前としてBuri Sportの文字が読める。
Google EarthグリンデルヴァルトBuri Sportというショップを探すと3つ場所がある。
3つの内の1つを絞りこめればflagが得られる。

earth.google.com

flag : TsukuCTF25{46.623_8.039}



buildings

あの建物が建ったら、また空が狭くなるんだろうな。
フラグフォーマットはこの人が立っている場所のTsukuCTF25{緯度_経度}です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。


チームメンバーの方に対象のビルがロイヤルパークス品川でまだ未完成であることを教えてもらった。
教えてもらった情報を元に位置的に会う場所をGoogleEarthで探すと、写真の場所が見つかった。

earth.google.com

flag : TsuchCTF{35.6318_139.7430}



rider

遠くまで歩き、夕闇に消える足跡
煌めく街頭が、夜の街を飾る
傍らの道には、バイクの群れが過ぎ去り
風の音だけが残る

光と影の中、ふと立ち止まり思う
私は今、どこにいるんだろう

フラグフォーマットはこの人が立っている場所のTsukuCTF25{緯度_経度}です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。

hints : この詩に意味はありません。


写真を見るとインドネシアのOTI Fried Chickenというフライドチキン屋さんの看板が見えるので手掛かりにする。
また周囲のお店は変わるが道路や信号機などの公共物はすぐには変わらないことを意識し、以下の条件をおさえる。
①大通りの2車線の道路で分離帯がないこと
②前方に信号機があること
函館のラッキーピエロよろしく、インドネシアで店舗数が多いので探すのに苦労したが、上記の公共物の条件から以下の場所が分かる。

https://www.google.co.jp/maps/place/OTI+Fried+Chicken+Salatiga/@-7.3190071,110.4972088,3a,75y,219.12h,91.19t/data=!3m7!1e1!3m5!1s-OtFtAJdizudzSMv2fDhpA!2e0!6shttps:%2F%2Fstreetviewpixels-pa.googleapis.com%2Fv1%2Fthumbnail%3Fcb_client%3Dmaps_sv.tactile%26w%3D900%26h%3D600%26pitch%3D-1.185768698134595%26panoid%3D-OtFtAJdizudzSMv2fDhpA%26yaw%3D219.12097898131884!7i16384!8i8192!4m10!1m2!2m1!1soti+fried+chicken!3m6!1s0x2e7a78400c61e65b:0x78ef6a34ecb4a247!8m2!3d-7.319094!4d110.4970824!15sChFvdGkgZnJpZWQgY2hpY2tlbiIDiAEBWhMiEW90aSBmcmllZCBjaGlja2VukgEWZnJpZWRfY2hpY2tlbl90YWtlYXdheaoBYAoNL2cvMTFmc3FndnMxNxABKhUiEW90aSBmcmllZCBjaGlja2VuKAAyHxABIhtBJ4lCymC1BONVhoNbSWwSkdQ78BdUlE3IAJAyFRACIhFvdGkgZnJpZWQgY2hpY2tlbuABAA!16s%2Fg%2F11c1p80w99?entry=ttu&g_ep=EgoyMDI1MDQzMC4xIKXMDSoJLDEwMjExNDUzSAFQAw%3D%3D

flag : TsukuCTF25{-7.3189_110.4971}



destroyed

このTelegramの投稿の写真に写っている学校を特定してください。
フラグフォーマットはその場所の座標の小数点第4位を四捨五入して、小数第3位までをTsukuCTF25{緯度_経度}の形式で記載してください。
例: TsukuCTF25{12.345_123.456}
注意: この問題を解く過程で、戦争に関わる直接的な画像が表示される場合があります。


問題サイトにあるウクライナ語の文章から以下のことが分かる。

2022年12月24日にウクライナ・ザポリージャ州のステプネ村にあるステプネンシカ・ギムナジア(ステプネンシカ中学校)がロシア軍のS-300ミサイルによる攻撃を受け、学校施設が破壊された事件を指しています。

以下のサイトでgoogle mapの住所が公開されている。
ザポリージャザポリージャ地区ステプノ村議会ステプノ中等学校(1~3年生)
znayshov.com

記載されたgoogle mapの住所が解答する緯度経度になる。

flag : TsukuCTF25{47.798_35.305}



power

力を感じてきた。

フラグフォーマットはこの人が立っている場所のTsukuCTF25{緯度_経度}です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。


史蹟 点字 案内 でGoogle検索すると将門塚が見つかる。

flag : TsukuCTF25{35.6873_139.7627}



Web

len_len

"length".length is 6 ?

curl http://challs.tsukuctf.org:28888


指定されたURLへアクセスすると以下のメッセージが表示される。

┌──(root㉿kali)-[~]
└─# curl http://challs.tsukuctf.org:28888
How to use -> curl -X POST -d 'array=[1,2,3,4]' http://challs.tsukuctf.org:28888
┌──(root㉿kali)-[~]
└─# curl -X POST -d 'array=[1,2,3,4]' http://challs.tsukuctf.org:28888
error: no flag for you. sanitized string is [1,2,3,4], length is 9

ソースコードは以下の通り。

const express = require("express");
const bodyParser = require("body-parser");
const process = require("node:process");
const app = express();
const HOST = process.env.HOST ?? "localhost";
const PORT = process.env.PORT ?? "28888";
const FLAG = process.env.FLAG ?? "TsukuCTF25{dummy_flag}";
app.use(bodyParser.urlencoded({ extended: true }));
function chall(str = "[1, 2, 3]") {
  const sanitized = str.replaceAll(" ", "");
  if (sanitized.length < 10) {
    return `error: no flag for you. sanitized string is ${sanitized}, length is ${sanitized.length.toString()}`;
  }
  const array = JSON.parse(sanitized);
  if (array.length < 0) {
    // hmm...??
    return FLAG;
  }
  return `error: no flag for you. array length is too long -> ${array.length}`;
}
app.get("/", (_, res) => {
  res.send(
    `How to use -> curl -X POST -d 'array=[1,2,3,4]' http://${HOST}:${PORT}\n`,
  );
});
app.post("/", (req, res) => {
  const array = req.body.array;
  res.send(chall(array));
});
app.listen(PORT, () => {
  console.log(`Server is running on http://${HOST}:${PORT}`);
});

FLAGを確認するためにはarray型で長さが-1になるリクエストを投げればよい=array.length が負の値になるようなオブジェクトをリクエストする。 

.lengthプロパティを持つオブジェクトを作り、lengthプロパティを負の値にしたオブジェクトを作ることでarray.length<0をtrueにする。

┌──(root㉿kali)-[~]
└─# curl -X POST -d 'array={"length":-1}' http://challs.tsukuctf.org:28888
TsukuCTF25{l4n_l1n_lun_l4n_l0n}
flag : TsukuCTF25{l4n_l1n_lun_l4n_l0n}



flash

3, 2, 1, pop!

http://challs.tsukuctf.org:50000/


問題の概要

指定されたURLへアクセスするstartボタンが表示される。

startを押すとflashにて1~3と8~10まで数字が表示され、4~7は数字が表示されない。 最後に1~10までの数字を足し算して回答し、正解すればflagが入手できる。

ソースコード

from flask import Flask, session, render_template, request, redirect, url_for, make_response
import hmac, hashlib, secrets

used_tokens = set()

with open('./static/seed.txt', 'r') as f:
    SEED = bytes.fromhex(f.read().strip())

def lcg_params(seed: bytes, session_id: str):
    m = 2147483693
    raw_a = hmac.new(seed, (session_id + "a").encode(), hashlib.sha256).digest()
    a = (int.from_bytes(raw_a[:8], 'big') % (m - 1)) + 1
    raw_c = hmac.new(seed, (session_id + "c").encode(), hashlib.sha256).digest()
    c = (int.from_bytes(raw_c[:8], 'big') % (m - 1)) + 1
    return m, a, c

def generate_round_digits(seed: bytes, session_id: str, round_index: int):
    LCG_M, LCG_A, LCG_C = lcg_params(seed, session_id)

    h0 = hmac.new(seed, session_id.encode(), hashlib.sha256).digest()
    state = int.from_bytes(h0, 'big') % LCG_M

    for _ in range(DIGITS_PER_ROUND * round_index):
        state = (LCG_A * state + LCG_C) % LCG_M

    digits = []
    for _ in range(DIGITS_PER_ROUND):
        state = (LCG_A * state + LCG_C) % LCG_M
        digits.append(state % 10)

    return digits

def reset_rng():
    session.clear()
    session['session_id'] = secrets.token_hex(16)
    session['round'] = 0

TOTAL_ROUNDS = 10
DIGITS_PER_ROUND = 7
FLAG = "TsukuCTF25{**REDACTED**}"

app = Flask(__name__)
app.secret_key = secrets.token_bytes(16)

@app.route('/')
def index():
    reset_rng()
    return render_template('index.html')

@app.route('/flash')
def flash():
    session_id = session.get('session_id')
    if not session_id:
        return redirect(url_for('index'))

    r = session.get('round', 0)
    if r >= TOTAL_ROUNDS:
        return redirect(url_for('result'))

    digits = generate_round_digits(SEED, session_id, r)

    session['round'] = r + 1

    visible = (session['round'] <= 3) or (session['round'] > 7)
    return render_template('flash.html', round=session['round'], total=TOTAL_ROUNDS, digits=digits, visible=visible)

@app.route('/result', methods=['GET', 'POST'])
def result():
    if request.method == 'GET':
        if not session.get('session_id') or session.get('round', 0) < TOTAL_ROUNDS:
            return redirect(url_for('flash'))
        token = secrets.token_hex(16)
        session['result_token'] = token
        used_tokens.add(token)
        return render_template('result.html', token=token)

    form_token = request.form.get('token', '')
    if ('result_token' not in session or form_token != session['result_token']
            or form_token not in used_tokens):
        return redirect(url_for('index'))
    used_tokens.remove(form_token)

    ans_str = request.form.get('answer', '').strip()
    if not ans_str.isdigit():
        return redirect(url_for('index'))
    ans = int(ans_str)

    session_id = session.get('session_id')
    correct_sum = 0
    for round_index in range(TOTAL_ROUNDS):
        digits = generate_round_digits(SEED, session_id, round_index)
        number = int(''.join(map(str, digits)))
        correct_sum += number

    session.clear()
    resp = make_response(
        render_template('result.html', submitted=ans, correct=correct_sum,
                        success=(ans == correct_sum), FLAG=FLAG if ans == correct_sum else None)
    )
    cookie_name = app.config.get('SESSION_COOKIE_NAME', 'session')
    resp.set_cookie(cookie_name, '', expires=0)
    return resp

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

ソースコードの以下の部分で数字の乱数生成している。

def lcg_params(seed: bytes, session_id: str):
    m = 2147483693
    raw_a = hmac.new(seed, (session_id + "a").encode(), hashlib.sha256).digest()
    a = (int.from_bytes(raw_a[:8], 'big') % (m - 1)) + 1
    raw_c = hmac.new(seed, (session_id + "c").encode(), hashlib.sha256).digest()
    c = (int.from_bytes(raw_c[:8], 'big') % (m - 1)) + 1
    return m, a, c


session_id(アクセス時に変わる)はcookieにjwt形式で設定されており、取得可能である。
m,a,cは全てSEED(固定)とsession_id(セッションごとにランダム)からHMAC-SHA256で計算されているのでSEEDとsession_idが分かればLCGは手元でも再現可能である。
配布されたdockerイメージをみるとflash/static/seed.txtのディレクトリ構造になってる。

このときなぜかseedがむき出しで、取得できてしまう。

┌──(root㉿kali)-[~]
└─# curl http://challs.tsukuctf.org:50000/static/seed.txt
b7c4c422a93fdc991075b22b79aa12bb19770b1c9b741dd44acbafd4bc6d1aabc1b9378f3b68ac345535673fcf07f089a8492dc1b05343a80b3d002f070771c6

seedとsession_idが手元に揃ったのでflashの処理を手元で再現する。

import hmac, hashlib

SEED = bytes.fromhex("b7c4c422a93fdc991075b22b79aa12bb19770b1c9b741dd44acbafd4bc6d1aabc1b9378f3b68ac345535673fcf07f089a8492dc1b05343a80b3d002f070771c6")
session_id = "b63a9929db7a0cd30c72e8153421357e"  # Cookieから取得

DIGITS_PER_ROUND = 7
TOTAL_ROUNDS = 10

def lcg_params(seed: bytes, session_id: str):
    m = 2147483693
    raw_a = hmac.new(seed, (session_id + "a").encode(), hashlib.sha256).digest()
    a = (int.from_bytes(raw_a[:8], 'big') % (m - 1)) + 1
    raw_c = hmac.new(seed, (session_id + "c").encode(), hashlib.sha256).digest()
    c = (int.from_bytes(raw_c[:8], 'big') % (m - 1)) + 1
    return m, a, c

def generate_round_digits(seed: bytes, session_id: str, round_index: int):
    m, a, c = lcg_params(seed, session_id)
    h0 = hmac.new(seed, session_id.encode(), hashlib.sha256).digest()
    state = int.from_bytes(h0, 'big') % m

    for _ in range(DIGITS_PER_ROUND * round_index):
        state = (a * state + c) % m

    digits = []
    for _ in range(DIGITS_PER_ROUND):
        state = (a * state + c) % m
        digits.append(state % 10)
    return digits

# 各ラウンドの数字を取得・合計
total = 0
for r in range(TOTAL_ROUNDS):
    digits = generate_round_digits(SEED, session_id, r)
    num = int(''.join(map(str, digits)))
    print(f"Round {r}: {digits} -> {num}")
    total += num

print(f"\n[+] Total Sum to Submit: {total}")

実行結果

>python C:\flash_solver.py
Round 0: [6, 9, 7, 5, 1, 3, 2] -> 6975132
Round 1: [3, 0, 3, 6, 7, 7, 2] -> 3036772
Round 2: [2, 0, 4, 7, 3, 8, 7] -> 2047387
Round 3: [7, 3, 6, 5, 6, 4, 3] -> 7365643
Round 4: [9, 6, 8, 7, 9, 7, 7] -> 9687977
Round 5: [8, 7, 3, 4, 4, 0, 6] -> 8734406
Round 6: [2, 8, 6, 4, 0, 2, 9] -> 2864029
Round 7: [3, 7, 3, 5, 4, 2, 6] -> 3735426
Round 8: [5, 8, 9, 1, 2, 0, 5] -> 5891205
Round 9: [4, 3, 0, 8, 1, 1, 3] -> 4308113
[+] Total Sum to Submit: 54646090

上記を回答するとflagが得られる。

flag : TsukuCTF25{Tr4d1on4l_P4th_Trav3rs4l}

物怪観光の秘密道具を注文したら職人のものつくりを学んだはなし

ごきげんようかい。

先日、SNSでふと目に留まった「もののけ目がね」。その奥深い魅力に、一瞬で心を奪われました。

物怪観光社員が携行するノーマルタイプ


水木しげる先生の「妖怪というのは、くだらんものを一生懸命見る努力をして、見えないものを無理矢理見るということ」という言葉を具現化したこのアイテムは、物怪観光の社員の方々の基本装備なのだとか。
もののけ目がね』の活躍の様子


シンプルなノーマルタイプも素敵ですが、今回はフルオーダーに挑戦。日常に新たな視点を取り入れたい、という知的好奇心から、少し特別な体験を求めてみることにしました。

オーダーメイドという贅沢な時間

応募フォームから注文後、フルオーダーのイメージについて、丁寧なヒアリングが行われました。ただ、どんな妖怪をモチーフにすれば良いか、なかなかイメージが湧かず…。

正直にその旨をお伝えしたところ、大変親身なアドバイスをいただきました。

「メガネは、お客様にとって唯一無二の存在。こちらから提案するのではなく、お客様がどのようなものをお求めなのか、じっくりとお伺いしながらデザインを具現化していきます。どんな些細なことでも構いませんので、あなたの感性を教えてください。そこから、一緒にイメージを紡ぎ上げていきましょう。」

プロフェッショナルの仕事に触れる

いただいたアドバイスを元に、自分の好きなモチーフをいくつかお伝えしたところ、すぐにイメージ画と提案書が届きました。そのスピード感と、私の曖昧なイメージを具現化するプロの仕事ぶりに、深く感銘を受けました。

イメージ画像

メールでのやり取りを通して、改めて「ものづくり」の奥深さと、そこに込められた情熱に触れ、心が満たされるような時間を過ごしました。

製作途中


特別な「もののけ目がね」との出会い

最終的な仕上げとして、ストラップと留め具のカラーを選び、ついに完成した「もののけ目がね」。

ストラップと留め具のカラー選び


箱を開けた瞬間、その美しさに息を呑みました。メガネ本体はもちろん、箱にまで施された細やかな細工に、職人の方の丁寧な仕事ぶりが表れています。
完成図


メガネの完成度の高さに加え、お客様の想いを汲み取る提案力、真摯なものづくりへの姿勢、そして、常に相手への配慮を忘れない心遣いに、プロフェッショナルとしての在り方を学ばせていただきました。

もののけ目がね」が教えてくれたこと

私は、「もののけ目がね」は単なる工芸品ではなく、私たちの認識の枠を超え、新たな視点を与えてくれる特別な道具だと感じました。

私たちは、日々の忙しさの中で、つい目の前のことだけに捉われがちですが、この世界には、目に見えないけれど大切なものがたくさんあるのかもしれない。

もののけ目がね」は、そんな「見えない世界」への扉をそっと開けてくれる、不思議な魅力を持ったアイテムです。

妖怪を探す過程で、職人の方のものづくりに対する情熱や哲学に触れ、多くの示唆を得ることができました。

いくつになっても、好奇心を大切に。 「もののけ目がね」は、そんな大切なことを思い出させてくれる、特別な出会いでした。

いくつになっても、好奇心を大切に!!

CISA 合格体験記

先日CISAという監査系のセキュリティ資格の試験に合格しました。受験勉強の間、様々な方の合格体験記を読みながら参考にしたこともあり、後学の受験者のために記録を残しておきます。

CISA(Certified Information Systems Auditor)について

公認情報システム監査人(CISA)とは、アメリカ合衆国非営利団体であるISACAによって認定される情報セキュリティの国際標準資格です。
試験はCBT形式で実施され、4時間(240分)で150問を解く形式です。出題範囲は5つのドメインから出題されます。(2025年2月8日現在)
ドメイン 1 – 情報システム監査のプロセス (18%)
ドメイン 2 – IT ガバナンスと IT マネジメント (18%)
ドメイン 3 – 情報システムの調達、開発、導入 (12%)
ドメイン 4 – 情報システムの運用とビジネスレジ リエンス(26%)
ドメイン 5 – 情報資産の保護(26%)

受験の前提

私のステータス

 JTCのシステムエンジニアとしてインフラ領域のシステム提案・設計・構築を担当しています。
 RISS(登録)やCISSP、CEHなどを取得済であり、セキュリティ技術はある程度の知識がありました。
 監査業務については未経験で、追加の学習を要する状況でした。

 CISAの各ドメインと自身のスキルマップの関連性は以下のような状況です。
 (★4つ判定で、★が多いほど関連あり。)
 1.情報システム監査のプロセス (★☆☆☆)
 2.情報システムの運用およびビジネスレジリエンス (★★★☆)
 3.情報システムの調達、開発、および導入 (★★☆☆)
 4.ITガバナンスとITマネジメント (★☆☆☆)
 5.情報資産の保護 (★★★★)
 

学習にあたっての傾向分析

👦インフラ領域のシステムエンジニアの場合👧
 【得意分野】
 顧客提案で災対環境整備やバックアップ設計を行うため、ドメイン2は前提知識がありました。
 同様にCISSPや支援士で過去に学習しているため、ドメイン5も少ない学習ですみました。
 【不得意分野】
 通常監査業務を実施しないため、ドメイン1と4は重点的な学習が必要でした。
 開発業務をメインで実施していなため、ドメイン3も中程度の学習が必要でした。

受験の動機

😀【表の理由】監査業務の知識を得るため
 国際的な権威資格であるCISA試験の理解を深めて、監査業務に役立つ知識を得たいと思いました。
 官公庁の入札資格要件に含まれている場合もあり、案件獲得にも有用です。
🤫【裏の理由①】会社の褒賞金獲得のため
 JTCにありがちな安月給の社畜のため、自身の給与水準を少しでも人並みに近づけたいと思いました。
🤫【裏の理由②】社畜の出口戦略のため
 所属企業以外の管理系コミュニティ参加を意識しました。
 個人的に選択するコミュニティは、自分の好みで良いと思います。
  ・管理系であればISC2やISACAなど
  ・技術系であればCTFやOffsec、競技プログラミングなど

 社畜の陥り安い脆弱性として、関連企業以外のコミュニティ関係が希薄であることがあげられます。
 この脆弱性は企業の体制変更や経営悪化などの脅威が起きたときに、深刻なリスクとなります。
 また、現在の日本の雇用情勢では、終身雇用からジョブ型雇用の大きな転換期を向かえています。
 雇用の安定と引き換えに業務時間を捧げる社畜にとって、所属企業の変化は何よりも怖いものです。
 しかしこの将来的な環境変化の恐怖を、何も考えずにリスク受容する必要はないと思います。
 状況を客観視して自身に最適なリスク軽減を図ることが、大切なのです。

勉強について

勉強期間

 2024年10月~2025年2月(5か月)

当初2024年10月に勉強を開始し、2024年12月の受験を想定していました。
しかし家族の入院や会社のセキュリティイベント対応などで時間がとれず、
2024年12月→1月→2月と3回ぐらいリスケしています。

☛ point :リスケは最小限にする

何回もリスケ繰り返すと心理的なハードルが下がり、勉強の継続が難しくなる場合があります。リスケは最小限が良いでしょう。

使用した教材

受験にあたり、専門学校は利用せずに独学でのぞみました。
(★4つ判定で、★が多いほどおすすめ。)

CISA Questions, Answers & Explanations Database 2024 - Japanese (★★★☆)

ISACAから提供されている1,000問前後の問題集になります。 この問題集の問題を解きながら、不明な用語や考え方を整理していきます。 時々日本語訳がおかしい点があるのは、他の受験者の方も記載の通りです。

② CISM試験レビューコース (★★★★)

ISACA東京支部で3か月ごとに開催されている2日間の勉強会です。
CISA試験レビューコースは最近未開催のため、本コースに参加しました。
ISACAとしての考え方を理解することに非常に役立ちました。
CISA(監査人視点)とCISM(セキュリティ管理者視点)で立ち位置は変わるのですが、ISACAが考える前提は同じであるため、CISA試験の受験でも役立ちます。
講師の方々も現役のエンジニアとして補足説明を入れてくれたり、質問事項に答えたりもしていただけるので、参加してマイナスになることはないでしょう。

CISA Official Review Manual, 28th Edition eBook 2024 - Japanese (★★☆☆)

ISACAから提供されている公式の参考書になります。
不明点があるときに参考書として利用しました。
多分実際に使ったのは10数回程度でほぼ読んでいません。

学習方法

以下の流れで問題集を2週しています。

☛ point :問題は雑でも良いので最後まで解く。

1,000問の問題を解くなかで最初の1週目は1番時間がかかり、1番辛いです。
しかし2週目、3週目となると解くスピードは速くなり、1週目ほどの時間は必要ありません。
1番辛い最初の1週目を過ぎるとだいぶ楽になるため、雑で良いので最後まで解いて問題の全体感を把握しましょう。

問題集のカテゴリ毎の演習(1週&2週目)

期間:2024年9月~12月(3か月)
この期間は、各カテゴリごとに問題を解きました。
1度問題を解いた後に問題集の問題をExcelへ書き写しながら、振り返りを合わせて実施しました。
あわせて問題集に付属のFlashCard(用語集) も書き写しながら、不明な用語が無いようにしました。
解き始めだったこともあり、得点状況は58%で推移していました。
※間に9月と12月のCISM試験レビューコースを受けています。

問題集のテスト演習(1週目)

期間:2025年1月(1か月)
問題集に用意されている3回分の練習問題(テスト演習)を実施しました。
問題は各カテゴリで出題された問題が150問分抽出されて、出題されます。
85%以上が受験の目安ですが、3回とも74%で焦りを感じていました。

問題集のテスト演習(2週目)

期間:2025年2月(数日)
問題集の練習問題をリセットして再度3回分の問題を解きました。
このころになると知識が定着して解く時間もだいぶ早くなります。
練習問題3は受験当日の朝に1時間程度で解いています。

☛ point :試験を受けるタイミングについて

問題文の正答が解答をみなくても頭に浮かぶようになれば、試験を受けるタイミングと考えてます。
これは他の方の受験記で一番参考になった内容ですが、理解が進んでいる方の解き方として問題文を一読後に正答を頭で思い浮かべて、一番近い解答を答えるというような解き方をされていました。
上記の内容を参考に2週目以降の学習では、正答が頭の中に浮かぶようになるまで理解することを心がけました。
問題集では85%以上が受験の目安ですが、必ずしもこの目安にこだわる必要はないのでは?とも思います。

受験当日

受験開始まで

当日の受験は午後からの試験でした。
午前中に試験会場の下見を行い、空き時間はカフェで最後の振り返りを実施していました。

受験開始~終了まで

試験問題は他の方の記載にもある通り記載できませんが、受験前に気にしていた日本語の意味不明な訳はほぼ無い印象です。
試験自体は2時間半程度で解き終わり、チェックを付けた問題をだらだら見直しながら4時間フルで使いました。

受験終了後

試験後にモニタで合格の表示を確認し、試験官と一緒に再鑑して試験は終了しました。
体感的にCISSPの受験時と比較すると試験中に解けている手ごたえはありましたが、終了ボタンを押下するときは不安になります。
例外にもれず私も祈りながら、画面を食い入るように見つめていました。

受験後の感想

リスクアセスメント関連を徹底的に学ぶので、普段担当している業務遂行に必要なエッセンスも多く、取得して良かったと思ってます。
学ぶ前はよくわからなかった以下の点も、CISAの学習を通して改めて理解しました。
・リスク選好度とリスク許容度の違いは?
・固有リスクと発見リスクと統制リスクと監査リスクの違いは?
・準拠性監査と実証性監査はどちらから始める?
・BIAでデータの重要度を最終的に決めるのは誰?

個人的に1番参考になったのは、以下の考え方です。
事業戦略(コーポレートガバナンス)の導入に当たっては整合が取れないことを防ぐために、ステークフォルダへのコンセンサスを得る。
最近アカウント業務やマネジメント業務をするようになったこともあり、うなずきすぎて首が壊れるぐらいこの考え方は重要視しています。

最後に

・最後までお読み頂き、有難うございました。CISA受験へ少しでもご参考になれば幸いです。
・今後の予定ですが、CISAの知識が残っている内にCISMを目指すか、CISSPとのパワーコンビであるCSSPを取るか悩んでいます。
・CISMレビューコースのスペシャルな講師の方々へはこの場を借りてお礼申し上げます。

i3CTF - Writeup

March 14-28, 2023 UTCに開催されたi3CTF に個人で参加した。
初心者なりの奮闘を見せて全体8位(35/43問)解いたので、特に印象的だった問題のWriteupを記載する。

Misc

sea

uncomfortable feeling


添付ファイルはsea.mp4という動画ファイル。
動画ファイルでよくあるようにSonic VisualizerでSpectorogramを見てみる。

参考 blog.welcomethrill.house


[Add Spectorogram]を通してみると、一番下に点と線で表現された文字(赤枠の部分)が見える。

点と線で表現されたmorse codeであるので、適当なオンラインサイトでdecodeすればflagが得られる。


Misc

fuda

What is the name of the temple where this “fuda” is located?

Flag format: FLAG{temple name}
Temple names are case insensitive in English.


添付ファイルはfuda.pngという仁王像に関する立札の画像ファイル。
見切れている文字を想像するのに時間がかかったが、画像から以下を推測した。
・仁王像に関する立札
・増高は320~330cm前後(32尺~33尺だと大きすぎて数が限られる)
・通常の阿吽像とは逆の配置(逆の上部分がかすかに見える)
・鎌倉期作で平成二年 or 平成二十数年に文化財指定されている

上記を条件に「仁王像 平成二年 文化財指定 左右逆」でGoogle検索すると、以下のサイトがみつかる。

*murachanの歴史ぶらり旅!      *明眼院!(大治町
blog.goo.ne.jp

このサイトにまさに立札そのものの画像があり、flagが判明する。


Photographer

This picture is beautiful!
I'd love to see his other photos!


添付ファイルはbeautiful.jpgという風景の画像ファイル。
プロパティ情報をみると「promise_heavily_amongst」というキーワードがある。
what3wordsを最初疑って調べたが関係のない土地が見つかる。
ならばInstagramを調べてみると案外簡単に該当のユーザが見つかり、flagが書かれている。

https://www.instagram.com/promise_heavily_amongst/



Web

login2

The Road to SQL Master - Part2 -

https://s1.ikbase.net/login2/


Blind SQL injectionの問題。
バックエンドのDBはmysqlで構成されているがusersテーブル以外にs3cureテーブルがある。

usersテーブルの大体の構造は以下の通り。
※最初のログイン時に表示されるflagもここから引っ張ってきているかも?

user password flag
root toht3892h29g9oe FLAG{this_flag_is_false._true_flag_is_not_here}


・blind sql injectionなので、スクリプトを組んでs3cureテーブル内のカラムを確認する。
・このときs3cureテーブルにはflagカラム以外にfl4gカラムがある。
※flagカラムに指定されている値はダミーFLAGの模様。
・後はs3cureテーブルのfl4gカラムのレコードを確認するとflagが判明する。


Network

ppap

We have obtained top secret data on "tare", an important person. I want you to uncover tare's secret in this file.


・問題ファイルではpcapファイルが与えられる。
ppapなんでSMTP関連の通信が怪しいかな?と調べるとTLS通信の秘密鍵を送信していた。
秘密鍵を抽出して、wiresharkに設定するとsecret.pcapファイルを通信している。
・secret.pcapではRTPプロトコルでストリーミング動画をやり取りしている。
・以下のサイトのWriteupを参考に、H.264形式の動画ストリーㇺを抽出するとflagを書いている動画が確認できる。

blog.hamayanhamayan.com

Reversing

hello

For starters


・UPXでpackされているのでunpackしてからGhidraで確認するとflagが判明する。

pyc

0.1 + 0.2 = 0.3 ?


・pycなのでリバースして元のpythonコードを確認すればflagが判明する。

Liar

Huh? That's strange... this EXE file doesn't work?


・shuffle.exeというファイルが渡される
・exeファイルかと思いきや、RLO拡張子偽装されたshufexe.elfというelfファイル
・elfファイルのマジックナンバーより前の部分にexeファイルの情報が追加されているので、不要な部分を削除してGhidraで確認するとflagが判明する