CHARGENプロトコル（キャラジェン・プロトコル）は、インターネット・プロトコル・スイートのサービスの1つであり、1983年にジョン・ポステルによって執筆された  で定義されている。試験、デバッグ、測定に使用されることを目的としている。"CHARGEN"は"Character Generator"（文字生成器）の略である。設計上の欠陥から悪用されることが多いため、現在ではこのプロトコルはめったに使用されない。

ホストは、Transmission Control Protocol(TCP)またはUser Datagram Protocol(UDP)を使用し、ウェルノウンポート番号であるポート番号19で、CHARGENプロトコルに対応したサーバに接続する。TCPで接続された場合、サーバはホスト側から切断されるまで、ホストに対し文字列の送信を開始する。UDPで接続された場合、ホストからデータグラムを受信するたびに、サーバは0から512の乱数を含むUDPデータグラムをホストに送信する。サーバが受信したデータは全て破棄される。

inetdでの実装
UNIX系のオペレーティングシステムでは、CHARGENサーバはinetdファミリーのデーモンに組み込まれている。CHARGENサービスは通常、デフォルトで無効になっている。ファイルに次の行を追加し、inetdで設定をリロードすることで有効になる。

 chargen   stream  tcp     nowait  root    internal
 chargen   dgram   udp     wait    root    internal

利用
CHARGENサービスは、ネットワークを使用するプログラムをデバッグする際に、境界チェックやバッファ管理のためのバイトストリームの信号源として使用できる。ハードウェア圧縮が有効になっている場合は、CHARGENサービスからの出力が圧縮されるので考慮が必要である。この圧縮により、回線を通過した実際のデータ量ではなく、帯域幅テストで解凍後のデータサイズが報告される可能性がある。

使用例
通常のCHARGENサービスのセッションの例を以下に示す。この例では、telnetクライアントを使用してホストに接続している。出力の形式は  で規定されていないが、推奨されるパターン（かつ事実上の標準）は、ASCIIコードの72個の印字可能文字を繰り返し表示するものである。これは、telnetセッションを終了してTCP接続が閉じられるまで続く。

$ telnet localhost chargen
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw
123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy
3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{
56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|
6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} 
89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !
^]
telnet> quit
Connection closed.

悪用
このサービスは、Windows NT 4.0上で動作しているMicrosoftドメインネームサーバ(DNS)を、DNSサーバのリスニングポートに直接パイプで接続する(telnet ntbox 19 | telnet ntbox 53)ことによって破壊するのに悪用された。

UDPによるCHARGENは、DoS攻撃でよく使用される。なりすました送信元アドレスを使用することにより、攻撃者はUDP CHARGENアプリケーションから標的に対して大量のトラフィックを送信することができる。実装に応じて、UDP CHARGENは受信するデータの200〜1,000倍のデータを送信する。

かつて、CHARGENはネットワークに接続されたプリンタに広く実装されていた。CHARGEN等のセキュリティ上の問題が認識される以前の古いモデルでは、プリンタのファームウェアが更新されることはめったになかったが、それでもプロトコルを実装するネットワーク接続プリンタは多数ある。これらがインターネットから見える場所にあった場合、DoS攻撃の踏み台として悪用されてしまう。攻撃者は、UDPポート19のCHARGENソースを探してネットワークをポートスキャンすることがよくある。一部のDDoS攻撃型のトロイの木馬は攻撃トラフィックにUDPポート19を使用するようになり、プリンタでCHARGENが使用可能であることが一層問題となった。

関連項目
 ECHOプロトコル
 DISCARDプロトコル
 DAYTIMEプロトコル
 TIMEプロトコル
 Fraggle攻撃

脚注

アプリケーション層プロトコル
Telnet
0