ママセキュリティエンジニア奮闘記
~ 子供と一緒にラズパイで遊んでみた♪ ~
1
吉田万里子
ソニーデジタルネットワークアプリケーションズ
#devsumiA 【17-A-L】
自己紹介
• セキュリティエンジニア
– ソフトウェアの設計~運用におけるセキュリティコンサル
• カバー範囲は、スマホアプリ、サーバーアプリ、サーバーインフラ
• AndroidやLinux kernelのソースを読む機会が多い
• 2歳、4歳の女児の母
– 仕事と子育てに奮闘中
2
みなさんについて教えてください
3
4
背景
2つの大切なこと
5
仕事
子育て
2つの思い
6
親としての思い
• 子供との時間を大切にしたい
• いろいろな経験をさせてあげたい
• 考える力を身につけてほしい
エンジニアとしての思い
• エンジニアとしてスキルアップをしたい
• 知的好奇心を満たしたい
ママエンジニアのToDo
7
• 脆弱性の調査をする
• セキュリティレビューをする
• 資料を作成する
• ごはんを食べさせる
• 保育園に送迎する
• 寝かしつける
• ○○について、正しく理解する
• ○○が使えそうなので、調べておく
緊急度
重要度
• 子供と一緒に○○に取り組む
• いろいろな経験をさせてあげる
• 考える力をつけてあげる
• 上履きを洗う • 交通費の精算をする
• 鼻水を吸引する
ママエンジニアのToDo
8
• バグをとる
• 機能を実装する
• 資料を作成する
• ごはんを食べさせる
• 保育園に送迎する
• 寝かしつける
• ○○について、正しく理解する
• ○○が使えそうなので、調べておく
重要度
• 子供と一緒に○○に取り組む
• いろいろな経験をさせてあげる
• 考える力をつけてあげる
• 上履きを洗う • 交通費の精算をする
• 鼻水を吸引する
緊急度
問題
9
時間がない
ママエンジニアの1日
10
3:00 6:00 9:00 12:00 15:00 18:00 21:00
自分時間
生活&送迎
仕事
移動
移動
生活&送迎
3:00 6:00 9:00 12:00 15:00 18:00 21:00
自分時間
生活
お出かけ
生活
平日
休日
夕食の準備、家
の雑用、仕事
仕事時間:8h
生活時間: 5h
生活時間: 7h
お出かけ時間: 6.5h
大人1 or 2,子供2
問題解決のポイント
11
おでかけの時間
〇〇の時間
おでかけの時間を
より有意義な時間へ
子供のプログラミング環境の整備
 PCが5,000円で入手可能に
 Raspberry Piが2012年に発売され、2016年末までに1000万台販売さ
れている
 小学校からのプログラミング学習が必須化
– 文部科学省が2020年から小学校でプログラミング教育を必修化するこ
とを検討している
– 品川区立共用小学校でのRaspberry Piを使った授業の様子が「情報処理
(2016/12月号) 」で特集された
• 子供向けプログラミングの書籍の出版
– 「ルビィのぼうけん こんにちは! プログラミング」/2016年5月
– 「小学生からはじめるわくわくプログラミング」/2016年5月
12
• https://ja.wikipedia.org/wiki/Raspberry_Pi
• http://www.mext.go.jp/b_menu/shingi/chousa/shotou/122/index.htm
• https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86-2016%E5%B9%B412%E6%9C%88%E5%8F%B7/dp/B01M9ID4EE
• https://www.amazon.co.jp/gp/product/4798143499
Scratch開発者の主張
Scratchで得られた「創
造力」、「論理的思考能
力」、「協調性」は、将
来、子供がプログラミン
グをしなかったとしても
役に立つ
13https://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code/transcript?language=en
“Most people won‘t grow up to become
professional computer scientists or programmers, but
those skills of thinking creatively, reasoning
systematically, working collaboratively -- skills you
develop when you code in Scratch -- are things that
people can use no matter what they’re doing in their
work lives.”
MIT Media Lab. Mitchel Resnick氏の2012年のTEDス
ピーチより
そういう力、身につけてほしい
問題解決のポイント
14
おでかけの時間
RPiの時間
おでかけの時間を
より有意義な時間へ
4歳児にはちょっと早い?
ある日の気づき
自転車で献血センターの前を通った日のこと
• 献血→輸血の話の説明をすると、何度も「もう一回」と言った
15
話が分かるようになってきた?
解決方法
16
親としての思い
世の中の
流れ
エンジニアとして
の思い
タイミング
発表内容
17
 目的と方針の確認
 作戦実行内容
• さがす
• つくる
• ひろげる
• あじわう
 検証
18
RPi作戦
目的と方針の確認
19
目的:2つの思いを叶える
20
親としての思い
• 子供との時間を大切にしたい
• いろいろな経験をさせてあげたい
• 考える力を身につけてほしい
エンジニアとしての思い
• エンジニアとしてスキルアップをしたい
• 知的好奇心を満たしたい
• HWを制御する仕組みを正しく理解したい
• Raspberry Piをさわってみたい
• 子供とじっくりRPi○○制作に取り組みたい
• 動く「仕組み」に興味をもってほしい
ブレイクダウン
ブレイクダウン
(私の)ブーム理論
過去に訪れたブーム
– 自転車ブーム
– 骨ブーム
– お手紙ブーム
– 包丁ブーム
– レゴブーム
21
• 子供には、次々に何かに対するブームがやってくる
• ブームは、突然訪れ、突然去っていく
• ブームにのると、凄いスピードで吸収する
方針:ブームにのる
• 子供がブームにのってつくる
– 子供にとっても楽しい時間になるように
• 親は、タイミングを合わせて少しだけ背中を押してあげる
• ブームの勢いで、子供が独自の発想をひろげる
22
さがす
つくるものを探す
23
4歳児の紹介
• 年齢
– 4歳4ヵ月
• 好きなこと
– ぷーさんのお世話、おままごと
– 自転車、ぶらんこ
• ITリテラシー
– iPadは、自分で「端末ログイン→アプリ起動→アプリで遊ぶ」の一連の作業ができる
– ママの真似をしてキーボードをカチャカチャするのは好き
24
お世話好き、アウトドア好き
ITリテラシーは高め
プチ経験によるブーム探し-1
25
興味持続時間:10分
ネコの動きは面白がったものの
Scratchのネコにい
ろいろな動きをさせ
て遊ぶ
没!
プチ経験によるブーム探し-2
26
興味持続時間:3分
最初は「すごーい!」と言ったものの
たくさんLチカさせて
遊ぶ
没!
プチ経験によるブーム探し-3
27
興味持続時間:15分
サーボモーターで
ドアを開ける
没!
最初は姉妹で取り合いをして鍵を開け閉めしていたものの
プチ経験によるブーム探し-4
28
DCモーターでト
ラックを動かす
興味持続時間:20分(1日目)+15分(2日目)
2日間に渡って、いわしせんべいを運送
つくるもの
29
https://www.amazon.co.jp/カラー図解-最新-Raspberry-Piで学ぶ
電子工作-作って動かして仕組みがわかる-ブルーバックス-金丸隆
志-ebook/dp/B01IETZKR6/
つくる
30
まずはサンプルをそのままつくる
作業計画
31
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2017年1月
つくる
ひろげる
予備
勝負の3連休
プチトラック
体験
ブーム到来の確認
• 前日、保育園からの帰り道
– ママ:「あしたさー、〇〇と一緒に〇〇のパソコンで車つくろうかと
思うんだけど」
– 長女:「いいよー」(ニコニコ)
• 当日朝
– 長女:「きょう?きょう車つくるの?」(キラキラ)
32
完璧です!
1日目作業実績
33
3:00 6:00 9:00 12:00 15:00
はんだづけ モーターボックス
組立て、配線
車体組立 車体組立
工作道具遊び
モーター動作確認
工作道具遊び
長女の作業
• ネジを締める
• プッシュピンを押し込む
• モーターの動作確認をする
休憩
WebIOPi
セットアップ
ママ
共同
長女
回るテープに大興奮
モーターの先にテープを巻いて、モーターの動作を確認
34
1日目作業実績
35
3:00 6:00 9:00 12:00 15:00
はんだづけ モーターボックス
組立て、配線
車体組立 車体組立
工作道具遊び
モーター動作確認
工作道具遊び
長女の作業
• ネジを締める
• プッシュピンを押し込む
• モーターの動作確認をする
休憩
WebIOPi
セットアップ
ママ
共同
長女
パパ帰宅作業時間:4時間
2日目作業実績
36
3:00 6:00 9:00 12:00 15:00
ママ
共同
子供
休憩・
買出し
モーター
仮組込
車体組立
子供の作業
• ネジを締める
• 電池を入れる
• キャタピラを組立てる
• モーターの動作確認をする
工作道具遊び 工作道具遊び
車体組立
はんだづけ
モーター動作確認
作業時間:2時間 パパ帰宅
車体組立
ワイヤーパチパチの結果
電池ボックス買出し時の1ショット
37
3日目作業実績
38
3:00 6:00 9:00 12:00 15:00
部品を
車体に固定
作業時間:30分
ママ
共同
長女
完成
直進、回転、バック、いろいろな動きを楽しみました
39
大興奮
40
10分後
41
パパ:「△△、お出かけするよー」
42
長女:「○○もいくー」
43
ママ:「・・・」
ママを残し、パパと次女とお出かけ・・・
44
ひろげる
45
サンプルを拡張して、発想を広げる
46
叶わず・・・
(2017.02.16時点)
ひとり反省会
47
何故ブームが急転直下で去ってしまったのか?
• そもそも、ブームは突然に去ってしまうもの
• 一方で・・・
– 2日間が4歳児のブーム持続時間の限界?
– いつも一緒の次女が恋しくて仕方がなくなった?
– モーターやトラックは、長女にとって身近なものでなさすぎた?
– ママとつくる「過程」が楽しかった?出来上がったら興味がない?
48
不発の「どうして?」-1
iPadをタップすると、モーターについたセロハンテープが回るのを見て
– ママ:「どうしてiPadをタッチしたらテープが回るの?」
– 長女:「え?つながってるの?」
– ママ:「そう、iPadとモーターはつながっているんだよ」
(絵を描いて説明)
– 長女:「・・・」
49
不発の「どうして?」-2
ワイヤーが抜けて、キャタピラが片側しか動かず、トラックが回るのを見て
– ママ:「どうして回っちゃうの?」
– 長女:「わかんなーい」
– ママ:「片側しか動かないと回っちゃうんだよ」
– 長女:「片側しか動かないと回っちゃうのかー」
50これから挽回しようと思っていたのに・・・
ブームは去ってしまったようです
大人の時間を楽しみましょう
51
あじわう
エンジニアとして、Raspberry Piをあじわう
52
Browser
キャタピラトラックの構成
53
192.168.0.3
(port=8000)
myscript.js
webiopi.js
Raspbian
webiopi.py
myscript.py
GPIO 25,24,23,22
POST /macros/pwm4Write/0,0.133,0,0.161
Host: 192.168.0.3:8000
192.168.0.4
WebIOPi
アプリのコード
Native-C lib
モーター回転リクエストの処理フロー
POST /macros/pwm4Write/
0, 0.5744, 0, 0.5833, 0, 3
54
webiopi.Server myscript.pyBrowser
_webiopi.GPIO
(native c)
pwm4Write(0, 0.5744, 0, 0.5833 0)
pwmWrite(25, 0)
pwmWrite(24, 0.5744)
pwmWrite(23, 0)
pwmWrite(22, 0.5833)
#define BCM2708_PERI_BASE 0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000)
int setup(void)
{
int mem_fd;
uint8_t *gpio_mem;
if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0)
{
return SETUP_DEVMEM_FAIL;
}
if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL)
return SETUP_MALLOC_FAIL;
….
gpio_map = (uint32_t *)mmap( (caddr_t)gpio_mem, BLOCK_SIZE,
PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, GPIO_BASE);
}
WebIOPi-0.7.1¥python¥native¥gpio.c
ソースコードの確認(初期化処理-1)
55
←0x2000 00000x7E00 0000→
※ Raspberry Pi3で利用されているBCM2836/2837では、周辺機器用のPhysical Address上のアドレ
スは、0x2000 0000から0x3F000000に変更になっており、WibIOPiのパッチで、Raspberry Pi3の場
合は周辺機器用のベースアドレスが変更されていることに注意
←0x0000 0000
←0x2020 0000(GPIO用)0x7E20 0000→
https://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
Bus Address Field Name Description Size
0x 7E20 0000 GPFSEL0 GPIO Function Select 0
Function Select 0-9
32
… … … …
6. General Purpose I/O (GPIO)
なるほど・・・
ソースコードの確認-初期化処理-2
56
#define FSEL_OFFSET 0 // 0x0000
#define IN 0
#define OUT 1
void set_function(int gpio, int function, int pud)
{
if (function == PWM) {
function = OUT;
enablePWM(gpio);
}
...
int offset = FSEL_OFFSET + (gpio/10);
int shift = (gpio%10)*3;
set_pullupdn(gpio, pud);
*(gpio_map+offset) = (*(gpio_map+offset) &
~(7<<shift)) | (function<<shift);
}
WebIOPi-0.7.1¥python¥native¥gpio.c
Bus Address Field Name Description Size
0x 7E20 0000 GPFSEL0 GPIO Function Select 0
Function Select 0-9
32
0x 7E20 0004 GPFSEL1 GPIO Function Select 1
Function Select 10-19
32
0x 7E20 0008 GPFSEL2 GPIO Function Select 2
Function Select 20-29
32
Bit(s) Field Name Description
... ... ...
17-15 FSEL25 FSEL25 - Function Select 25
000 = GPIO Pin 25 is an input
001 = GPIO Pin 25 is an output
100 = GPIO Pin 25 takes alternate
function 0
...
Register Assignment
GPIO Alternate function select register 2
なるほど・・・
ソースコードの確認-モーター回転処理
57
Bit(s) Field Name Description
31-0 SETn(n=0..31) 0 = No effect
1 = Set GPIO pin n
Bus Address Field Name Description Size
0x 7E20 001C GPSET0 GPIO Pin Output Set 0 32
0x 7E20 0020 GPSET1 GPIO Pin Output Set 1 32
Register Assignment
GPIO Output Set Register 0
void pulseTS(int gpio, struct timespec *up, struct timespec *down) {
if ((up->tv_sec > 0) || (up->tv_nsec > 0)) {
output(gpio, 1);
nanosleep(up, NULL);
}
if ((down->tv_sec > 0) || (down->tv_nsec > 0)) {
output(gpio, 0);
nanosleep(down, NULL);
}
}
#define SET_OFFSET 7 // 0x001c / 4
void output(int gpio, int value)
{
int offset, shift;
if (value) // value == HIGH
offset = SET_OFFSET + (gpio/32);
else // value == LOW
offset = CLR_OFFSET + (gpio/32);
shift = (gpio%32);
*(gpio_map+offset) = 1 << shift;
} WebIOPi-0.7.1¥python¥native¥gpio.c
Bit(s) Field Name Description
31-0 SETn(n=32..53) 0 = No effect
1 = Set GPIO pin n
GPIO Output Set Register 1
なるほど・・・
/dev/memの権限の確認
• 公開され、root権限でread/write可能
• webiopiモジュールは、root権限で実行されている
• kernelのbuild設定で、CONFIG_DEVMEMが有効になっている
58
pi@raspberrypi:~ $ ps axu|grep webiopi
root 570 2.1 1.4 77340 13328 ? Sl 05:01 4:17 /usr/bin/python3 -m webiopi -l /var/log/webiopi -
c /etc/webiopi/config
pi@raspberrypi:~/linux $ KERNEL=kernel7
pi@raspberrypi:~/linux $ make bcm2709_defconfig
pi@raspberrypi:~/linux $ grep “DEVMEM” .config
CONFIG_DEVMEM=y
# CONFIG_DEVKMEM is not set
https://github.com/raspberrypi/linux
pi@raspberrypi:~ $ ls -lZ /dev/|grep mem
crw-r----- 1 root kmem ? 1, 1 1月 20 18:39 mem
なるほど・・・
/dev/gpiomemの権限の確認
• /dev/gpiomemは、gpioグループの権限でread/write可能
• RPi.GPIOは、/dev/gpiomemをopenしている
59
pi@raspberrypi:~ $ ls -lZ /dev/|grep mem
crw-rw---- 1 root gpio ? 244, 0 1月 20 18:39 gpiomem
pi@raspberrypi:~ $ id
uid=1000(pi) gid=1000(pi)
groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(g
ames),100(users),101(input),108(netdev),997(gpio),998(i2c),999(spi)
int setup(void)
{
// try /dev/gpiomem first - this does not require root privs
if ((mem_fd = open("/dev/gpiomem", O_RDWR|O_SYNC)) > 0)
{
gpio_map = (uint32_t *)mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0);
}
RPi.GPIO-0.6.3¥source¥c_gpio.c
なるほど・・・
比較:/dev/memの権限
• /dev/memは存在しない
• kernelのbuild設定で、CONFIG_DEVMEMが有効になっていない
• CTSでチェックしている(Android 2.3以降)
60
bullhead:/ $ ls -al /dev/mem
ls: /dev/mem: No such file or directory
# CONFIG_DEVMEM is not set
https://android.googlesource.com/kernel/msm/+/android-msm-bullhead-3.10-marshmallow-mr2/arch/arm64/configs/bullhead_defconfig
https://android.googlesource.com/platform/cts/+/master/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
Android
public void testDevMemSane() throws Exception {
File f = new File("/dev/mem");
assertFalse(f.exists());
}
比較:/dev/mem, /dev/gpiomemの権限
• /dev/memは存在しない
• /dev/gpiomemは、root権限でのみread/write可能
61
130|rpi3:/ $ ls -lZ /dev
total 0
crw-rw-rw- 1 root root u:object_r:ashmem_device:s0 10, 60 1970-01-01 00:00 ashmem
crw-rw-rw- 1 root root u:object_r:binder_device:s0 10, 59 1970-01-01 00:00 binder
crw------- 1 root root u:object_r:fuse_device:s0 10, 229 1970-01-01 00:00 fuse
crw------- 1 root root u:object_r:device:s0 248, 0 1970-01-01 00:00 gpiomem
Android Things
比較:/dev/gpiomem経由のGPIOの制御
• peripheralmanプロセスがroot権限で動いている
• アプリからGPIOを制御するには、PeripheralManagerServieceを利用
62
rpi3:/ $ ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 7336 1552 0 00000000 S /init
root 152 1 965944 94308 0 00000000 S zygote
audioserver 153 1 21844 7612 0 00000000 S /system/bin/audioserver
cameraserver 154 1 14512 6600 0 00000000 S /system/bin/cameraserver
keystore 157 1 7476 3648 0 00000000 S /system/bin/keystore
media 161 1 39664 9272 0 00000000 S /system/bin/mediaserver
root 162 1 22852 3804 0 00000000 S /system/bin/netd
root 163 1 9016 3820 0 00000000 S /system/bin/peripheralman
system 409 152 1109604 133516 0 00000000 S system_server
rpi3:/ $
PeripheralManagerService manager = new PeripheralManagerService();
mGpio = manager.openGpio(GPIO_NAME);
Android Things
https://developer.android.com/things/sdk/pio/gpio.html
なるほど・・・
検証
RPi作戦の結果を検証
63
64
親としての思い
• 子供との時間を大切にしたい
• いろいろな経験をさせてあげたい
• 考える力を身につけてほしい
エンジニアとしての思い
• エンジニアとしてスキルアップをしたい
• 知的好奇心を満たしたい
• HWを制御する仕組みを正しく理解したい
• Raspberry Piをさわってみたい
• 子供とじっくりRPi○○制作に取り組みたい
• 動く「仕組み」に興味をもってほしい
(ブレイクダウンした)2つの思いは叶ったか?
※4歳には、早すぎた?
(オリジナルの)2つの思いは叶ったか?
65
親としての思い
エンジニアとしての思い
• エンジニアとしてスキルアップをしたい
— 一番必要なスキルを身につけられる訳ではない
• 知的好奇心を満たしたい
★★☆
★★☆
• 子供との時間を大切にしたい
— 充実した時間を過ごせた
• いろいろな経験をさせてあげたい
• 考える力を身につけてほしい
— 動く仕組みはまだ早かった
★★★★★
★★☆
☆☆☆
RPi作戦は有効な手段か?
• はじめて、長時間1つのことに一緒に取り組むことができた
– 4歳児が、4時間飽きなかった
– 親も興味があるRPiだからこそ、4時間一緒に取り組めた
• おままごとに4時間つきあうのは、きっと無理
• RPiは様々な使い道があり、様々なブームの可能性を探ることができる
– ブームの可能性を探る時間も楽しい
• 子供との時間のためなので、途中で飽きない/心が折れない
• エンジニアでない人には難しい
• 一番必要なスキルを身につけられる訳ではなく、作戦実行には、準備も含
めるとかなりの時間がかかる
– 同じ時間をかければ、より重要なコトが複数できたかも
66
67
まとめ
まとめ
• RPi作戦を実行し、「2つの思い」を叶えるための手段として有効であることを確認した
– 4歳児は予想以上の集中力を発揮し、親子とも充実した時間を過ごすことができた
• RPi作戦では、「ブーム」を意識し、作戦実行によい効果をもたらしたと思われる
– 「ブームを探す」ために:
• 子供の日常をよく観察し、RPiに向かって連想ゲームを繰り返す
– 「ブームを止めない」ために:
• ドライバーやニッパー等による破壊工作リスクを受容し、子供がしたい作業をさせる
68
その後・・・
69
おまけ
2週間後
そっとテレビの前に置いてみた
– 反応なし
70
3週間後
• ママ:「トラック、どこにあったっけ?」
• 長女:「テレビの上にあったよ」
– 存在は認識しているらしい
– 触りもしない
71
トラックは諦め・・・
プチ経験によるブーム探し-続1
72
興味持続時間:10分+3分+3分+3分+3分+…
カメラをつけてかい
われ大根を観察
?
芽がでてふくらんでー
花が咲いて・・・
じゃんけんぽん!
はっぱがひらいて
にょきにょきにょきー
プチ経験によるブーム探し-続
73
アイデア募集中
74
ありがとうございました

【17-A-L】ママセキュリティエンジニア奮闘記 ~ 子供と一緒にラズパイで遊んでみた♪ ~