
はじめに
デジタルペンテスト部のν(ニュー)です。
最近、NFCタグを使ってWebサイトにアクセスさせる展示を見ました。 NFCタグは安価で済み、スマートフォンがNFCに対応しているため、自動販売機や、博覧会のような、広い参加者層を対象としたイベントで見かけることがあります。

NFCタグ自体は真新しい技術ではないものの、タグ自体が物理的に存在する故の注意点もあります。 本記事では、NFCタグの物理的な設置にあたって気を付けるべきことについて扱います。
想定環境
イベントの参加者に対して、NFCタグを通して特設ページへアクセスしてもらうことを想定します。 ページのURL自体は全参加者共通で、参加者以外に漏れても問題ないものとします。
NFCタグへのアクセスは、以下の環境で行います。
- ライブラリ:nfcpy
- リーターライター:RC-S380/S
- 使用タグ:NTAG215系

気を付けるべきこと
NFCタグに書き込み保護を設定する
NFCタグは、何も設定していない場合誰でも内部の情報を書き換えることができます。 書き換えには特別なデバイスは必要なく、NFC対応のスマートフォンでも行うことができます。
悪意のある内容に書き換えられることを防ぐために、イベントの会期中にURLの変更がない場合は、書き込みを完全にロックしてしまうのが最も楽な対応になります。 もちろん、ロック後は一切の書き込みができなくなるため、使い捨てになります。
以下のコードは、nfcpyを使ってNFCタグに対して弊社トップページのURLを含んだNDEFメッセージを書き込み、ロックをかけるものです。
#!/usr/bin/env python import nfc import ndef clf = nfc.ContactlessFrontend('usb') tag = clf.connect(rdwr={'on-connect': lambda tag: False}) print(tag) tag.ndef.records = [ndef.UriRecord('https://www.lac.co.jp/')] tag.protect()
このコードを使って書き込んだNFCタグを、分析ツールであるNFC TagInfoを使って読んだ結果が以下の図のようになります。

00から始まるページ番号と、データの間にあるステータスの*が、ロック済みであることを表しています。
この状態で書き込みを行おうとしても、AttributeErrorの例外が発生して書き込むことができません。
また、会期中にURLの変更がある場合は、パスワードによる認証を行った後に書き込みができるようにも設定できます。
nfcpyの場合、以下のコードのようにprotect()の引数にパスワードを設定することで行います。
tag.protect(password=b'\xfe\xed\xfe\xed\xfe\xed')
パスワードが設定されたNFCタグに対して書き込みを行う場合、書き込み前にauthenticate()で認証を行うようにします。
tag.authenticate(b'\xfe\xed\xfe\xed\xfe\xed')
パスワードを設定した状態のNFCタグを、NFC TagInfoを使って読み込んだ結果は以下の図のようになります。

ステータスの.rが、読み込みは認証なしで行え、書き込みには認証が必要であることを表しています。
設置や運用の方法
NFCタグはQRコードと同様、単体では誰が設置したものかを確認する手段がありません。 そのため、攻撃者がNFCタグを交換したり、正規のNFCタグの上から別のNFCタグを設置したりすることで、悪意のある内容を読み込ませてしまうことができます。
このような攻撃を防ぐには、正規のNFCタグをケースの中などに設置し、物理的にタグに触れることができない状況を作ることが必要です。 この設置方法を取ることで、NFCタグが交換されることを防ぎ、また上から別のNFCタグが設置された場合でも気が付きやすい状況を作ることができます。
もちろん、定期的な巡回を行い、NFCタグに対して上記のような攻撃がされていないかを確認することも重要です。