coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

SimplePrograms で Python を学ぶ その03

2024-03-15 08:46:37 | Python
SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

の 3番目のプログラムは、

friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print ("iteration {iteration} is {name}".format(iteration=i, name=name))


です。最後の行は表示で折り曲げられていたとしても、長い1行です。

3行なのでプログラムらしくなって来ました。1行目は形から配列ですね。多くの言語のように配列名の後に"[" と "]" があり、各要素を "," で分けるのですね。

説明文からfor によるループ表現と、enumerate() というビルトイン関数と、"%"とは別のフォーマットの方法がわかるようです。早速実行してみましょう。長い行は折れ曲がっているように見えますが1行です。

>>> friends = ['john', 'pat', 'gary', 'michael']
>>> for i, name in enumerate(friends):
... print ("iteration {iteration} is {name}".format(iteration=i, name=name))
...
iteration 0 is john
iteration 1 is pat
iteration 2 is gary
iteration 3 is michael
>>>

ここで各行のインデントが for ループの中を表すことが分かります。ループの中のプロンプトが "..." に変わるので、インデントしている行が続く限りループの中にあることになるようです。(インデントされていないように見える場合はインデントがあるという前提でご覧下さい。)ちなみに、... の後にインデントのない行を入れると

IndentationError: expected an indented block

のエラーになります。

問題は、for の後の、

i, name in enumerate(friends):

です。 まず Python では for の終わりに":"を付けるようです。よくある言語のように、 in の後ろのものから一つデータを生成して、in の前のものに代入するようです。in の前に ',' で分けた2つの変数に代入しているようですが、流石に類推は困難です。ここは、

The Python Language Reference
https://docs.python.org/3/reference/

を参照することにします。ちなみに、日本語ページはこちらです。(今はブラウザから適時翻訳できるので、そちらも活用できますね。)

https://docs.python.org/ja/3/reference/

リファレンスマニュアルで重要なのは索引ですが、右上の検索窓でも検索できます。

「enumerate(iterable,start=0)
enumerate オブジェクトを返します。 iterable は、シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクトでなければなりません。 enumerate() によって返されたイテレータの __next__() メソッドは、 (デフォルトでは 0 となる start からの) カウントと、 iterable 上のイテレーションによって得られた値を含むタプルを返します。」


と言うわけで、enumerate()関数は0から始まるカウンターとそれに対応するfriendsの要素の値を「タプル」(tuple)というペアにして返すようです。最初のカウンターは、friendsの何番目の要素かを示す値ですね。つまりループするたびに、enumerate()は、
0 , john
1 , pat
.....
のようにタプルを返す?わけです。返されたタプルの2つの値をそれぞれ i , name に代入して、friendsの全要素終了するまでループするのがこの記述ですね。

このenumerate()ですが、
>>> a,b = enumerate(friends,start=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
のような代入はできず。以下のように1つの変数には代入できます。
>>> a = enumerate(friends,start=0)

しかし、aの値は、
>>> print(a)
<enumerate object at 0x768749e0>
>>>
となるので、そのため a,b = のような代入ができなかったようです。当面は for の中で使うだけにしておいたほうが良さそうです。

ループの中の print()ですが、% の代わりに文字列の後ろに.format()が付加されています。「.」で繋ぐこういう形式はオブジェクトに対するメソッドとなることがよくあるものですが、python でも formatメソッドと言うそうです。

オブジェクトにあたる文字列は「置換フィールド」を含む文字列だそうで、{iteration} と {name} が置換フィールドに「キーワード」を指定した場合です。このキーワードの値は、formatメソッドのなかで、
キーワード=値
の形式で指定できるようです。ですから、
.format(iteration=i, name=name)
で、キーワードiterationの値を変数iの値に、キーワードnameの値を変数nameの値に指定するということのようです。
キーワードの値は文字列の指定場所に埋め込まれて、print()がその文字列を表示するわけですね。

formatメソッドは、他にも色々できそうなので今後に期待します。

また、
https://docs.python.org/ja/3/reference/compound_stmts.html#for
によると、「for文」と呼ぶのですね。

今後はプログラムからの推定が難しくなりそうなので、リファレンスを参考にすることになりそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SimplePrograms で Python を学ぶ その02

2024-03-09 21:43:30 | Python
SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

の 2番目のプログラムは、

name = input('What is your name?\n')
print ('Hi, %s.' % name)

です。

 ここは、1行づつ実行してみます。

>>> name = input('What is your name?\n')
What is your name?
Espiya       (Espiyaと入力しました。)
>>> print ('Hi, %s.' % name)
Hi, Espiya.
>>>

 多くのプログラミング言語では、「 = 」は変数への代入を表します。Python でも同じですね。つまり name は変数を表します。代入する値は、input()の出力です。この行を実行すると、関数 input() の引数の文字列が標準出力から表示され、入力待ちになります。ここで「Espiya」と入力すると、この入力した文字列がinput()の出力となり、nameに代入されるわけです。

 次の行のprint()関数の引数が、

%s を含んだ文字列 % 変数

となっています。

 その形状から「 % 」は演算子と思われますが、左の文字列に %s が含まれているので、右側の変数の値を %s の位置に埋め込む演算子であることが、print()の表示から確認できます。早速 Hello, world! のプログラムが使われおり、1番目のプログラムの重要性が分かります。%s があれば、整数を埋め込む %d や小数を表す %f がありそうですので試して見ます。

 まず変数への代入を使って変数a に数字を代入します。
>>> a = 1.234
>>> print(a)
1.234
>>>
print()の引数に変数を入れるとそのまま表示されますね。(空白文字の連続は正しく表示されない可能性があります。実際の Python で確かめて下さい。)

>>> print('a is %d .' % a)
a is 1 .
>>> print('a is %f .' % a)
a is 1.234000 .
>>> print('a is %.3f .' % a)
a is 1.234 .
>>> print('a is %10.3f .' % a)
a is 1.234 .
>>>

 予想通り、C言語で言うところのフォーマット指定子が使えそうです。%f の.3 は小数点以下3桁表示で、%10.3f は10文字の中に右詰めで小数点以下3桁表示の数字を入れる事ですね。

 ところで、print()の「出力」としないで「表示」としたのは、print()を実行しても通常の関数とは異なり出力があってその値を変数に代入できないからです。いい加減ですが、一応切り分けて書いています。

 例えば、

>>> print( 'a is %f .' % a )
a is 1.234000 .
>>> b = print( 'a is %f .' % a )
a is 1.234000 .
>>> print( b )
None
>>>

のように print() の出力を bに代入しても、bの値は 「None」です。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SimplePrograms で Python を学ぶ その01

2024-03-02 21:55:47 | Python
今回から、Raspberry Pi を使って Python を学ぼうと思います。と、言っても入門等は多数のサイトがあるので、別の方法を探ってみます。

そこで目を付けたのは、Python の公式サイト、

https://www.python.org/

です。ここの、「Documentation」のサブメニュー「Beginner's Guide」をクリックして、そこの「Learning Python」にあるプログラム経験者用の「BeginnersGuide/Programmers」をクリックして、「BeginnersGuide/Overview」を見ると、「SimplePrograms」という短いサンプルプログラムをまとめたものがありました。

SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

見ると、1行から、2行、3行、・・・と順番にプログラムの行数が増えて、複雑になるようにまとめられています。段々複雑になるそうで初心者向けサンプルプログラム集としてとても凝っています。

最後の方は難しそうなのでどうなるか分かりませんが、今回はこれを使って実際に Python を学んで見たいと思います。

一つ一つのプログラムは、実際に Raspberry Pi の python3 で1行づつ実行して、確かめて理解を深めます。いちから文法を見てというのはやらないで、その他のプログラミング言語からの類推で個々のサンプルプログラムを試して、確認を取るやり方で行います。

まずは、python3 を起動してみます。(Raspbian 12 の標準のものです。)

$ python3
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

バージョンは 3.11.2 でやや古いですがそのまま利用します。

「>>>」 がプログラムの各行の入力待ちのプロンプトですね。

標準入力待ちですので、Ctrl-D で終了できます。その他に、

>>> quit()
$

のように終了できます。python はインタープリタですから1行づつ入力しても動作するはずです。
早速 Python を学んでみましょう。

「SimplePrograms」の 1番目のプログラムは、

print ('Hello, world!')

です。早速実行してみます。

>>> print ('Hello, world!')
Hello, world!
>>>

いわゆる Hello, world! を表示するプログラムですが、このプログラムは極めて重要です。
プログラミング言語を習得する場合、その結果がどのようになるかを表示する必要があり、それはすなわち Hello, world! の変形で実現するからです。早速見てみますと、Python のいくつかの特徴がわかります。

1) print という関数を使って表示(標準出力への出力)を行う。
  関数は高校数学で y=f(x) のように表記するので、関数名とカッコで表し、カッコ内に関数に渡す引数を指定するのが一般的です。というわけで、この表記から python3 では print の命令文みたいなものは無く、関数で指示を行うと考えられます。つまりカッコの中は、引数であると考えてよさそうです。
 そこで、print という関数を表すために、print() と書くことにします。

2) print() に引数を指定するとそのまま表示される。
  引数が複数の場合はどうなるかは今後分かるでしょう。

3) 文字列は 'Hello, world!' のように「 ' 」文字で囲む。
  現在のプログラミング言語で、数値、文字列という概念は必須だと思うのでここで文字列の表記方法が分かりました。

4) 1行の終わりに何も無い。
  となると、長い行はどうなるのか興味深いです。

 ここで試しに、print()の前に空白文字をいれるとエラーになります。

>>> print( 'Hello, world!' )
File "<stdin>", line 1
print( 'Hello, world!' )
IndentationError: unexpected indent
>>>

 つまり、行の先頭の空白(インデント)に意味があるようです。

 おまけで、print と 「(」 文字の間の空白は無視されるようです。
>>> print ('Hello, world!')
Hello, world!
>>>
 分かりにくいので通常はそうしませんが。

 まだ、1番目なので簡単ですが、早速色々な事が分かったつもりになりました。今後、途切れないようにしたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ChatGPTのAPIを使った、LINEの AIチャットくん を使ってみる。

2023-04-08 13:55:19 | コンピュータ言語
久しぶりの投稿です。

LINEでChatGPTが使える「AIチャットくん」が公開されたので使ってみました。
ChatGPTをそのまま使うのはちょっと気になってやめていましたが、APIが公開されて早速このような機能が出てきたので利用することにしたわけです。

試しに何か質問してみようと思い、「そういえば以前使っていた乱数生成のツールをまた使おうとしたら正確な名前を忘れていた」ということで、次のような質問にしました。

(Q1とかA1は便宜的に付加したもので、質問と回答を意味します。適当に改行してあります。)

--- ここから --------------------
Q1
乱数生成で、評価の高いツールはなんですか?

A1
有名な乱数生成ツールには、以下のものがあります。

1. Mersenne Twister - 非常に高品質で、多くのプログラミング言語に実装されています。
2. XORShift - 高速で、シンプルなアルゴリズムです。
3. PCG - 優れたランダム性と高速性を兼ね備えています。
4. AES-CTR-DRBG - 暗号化のために使用されるアルゴリズムで、高品質の乱数を生成できます。

これらのツールは、科学的なシミュレーション、ランダムなアート、セキュリティ用途など、多くの分野で使用されており、高い評価を受けています。
--- ここまで --------------------

探していたものは、1.のMersenne Twister がであることが分かりました。
以前使用してからだいぶたっているので、最近は各種言語からも使えるはずでは?と予想して次の質問をしました。

--- ここから --------------------
Q2.
Mersenne twister は、python からも使えますか?

A2.
はい、Mersenne Twisterは
Pythonで標準ライブラリ`random`モジュールで使用することができます。
`random`モジュールは、Pythonの様々なバージョンで利用可能であり、
Mersenne Twisterの実装も含まれています。
以下は、Mersenne Twisterを使用するための簡単な例です。

```python
import random

# 0から1までの浮動小数点数を生成
random_number = random.random()
print(random_number)

# 範囲を指定して整数を生成
random_integer = random.randint(1, 10)
print(random_integer)

# Mersenne Twisterを使用して乱数を生成
random.seed(10) # シード値を設定
for i in range(5):
print(random.random())
```

このように `random` モジュールで使用することができます。
--- ここまで -------------------------------

Python の randomモジュールが Merusenne Twister を使っていたとは、初めて知りました。個人的に、今回の質問の大きな収穫です。
そこで、確認も兼ねて次の質問をしました。

--- ここから -------------------------------
Q3.
c言語のような言語のrand()だと乱数生成が単純だったように思うのですが、python は違うのですね。

A3.
はい、C言語の`rand()`は線形合同法というアルゴリズムを使って単純に乱数を生成しますが、
Pythonの`random`モジュールは、メルセンヌ・ツイスターという高品質な擬似乱数生成器を使っています。
これは、よりランダム性が高く、より偏りのない乱数を生成することができます。
また、Pythonの`random`モジュールには、様々な便利な関数が用意されており、
乱数生成における様々な操作を簡単に行うことができます。
--- ここまで -------------------------------

Pythonの乱数生成の説明と共に、C言語の rand()の確認と、このツールの読み方「メルセンヌ・ツイスター」も分かりました。ネット上で読み方が記入されており、それをChatGPTが拾ってきたようです。

この例からも分かるように、プログラミングや何かツールを作ろうとしたとき役立ちそうです。メルセンヌ・ツイスターは最初に種となる数字を与えると記憶していたので、その辺はどうなっているのか気になりますが、それは別の検索等で確認すればよさそうです。

しかしながら、この問答を理解するためには、
C言語、Python、乱数生成 など
の前提となる知識が必要です。今回は、昔メルセンヌ・ツイスターを使っていたので問答の理解の役にたちました。
そうでなければ、その後単独でメルセンヌ・ツイスターを実際に使ってみて生成される高品質な乱数を実感し、Python の random モジュールもそうなっているかを調べる必要があるわけです。

今回、Twitter で、 ChatGPT は知識を増幅するもの、という話を見かけたので、
これを裏付ける事例として紹介してみました。例えば以下のツィートなどを参考にしました。

『すでに多くの人が言っているけど、ChatGPTは人間の能力の代替というより「増幅」装置の側面が強くて、未来の仕事では、英語やプログラミングはもちろん、自分が関わっている領域(業界、職種)に精通しているかが鍵になるなということがよく分かる。つまりは「ちゃんと勉強しろ」ってことで、私ももっ…』

https://twitter.com/nori76/status/1643842667951034368?t=RDEZ_c5kXkE1WyKAPqgJHw&s=03

や、

『ChatGPT(GPT-4)はどうも自然言語やプログラミング言語を取り扱う能力に長けた人の能力を増幅させる力があるとみた。増幅する方向は処理速度、反復による質の向上などが上げられる。これをうまく仕事に応用すれば、生産性を桁外れに上げてくれるはずだ。可能性の検証はもちろん、実用性の検証もしたい。』

https://twitter.com/alfredplpl/status/1637790454237499397?t=i9-KAbFGRa-X9siqqJqJhA&s=03

です。

「知識を増幅できるが、そのためには予め前提となる知識が必要である。」ということで、
今後益々知識習得の重要性が分かりますね。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

子供用に、古いノートパソコンをScratch専用マシンにする

2019-11-10 08:40:21 | インストールと設定
久しぶりの投稿です。

2020年から小学校でプログラミング教育が必須になるようです。そこで注目を集めているのが、MITメディアラボが開発している言語 Scratch です。Scratchは、バージョンが 3.0 になってから、HTML、CSS、JavaScript で記述されているので、ブラウザがあれば利用できます。Scratch は Google と提携しているので、使用するブラウザは Google Chrome ですね。

ところで、Windows7 が2020年にメンテナンス終了ということで、世の中に Windows7 が動いているノートパソコンが多量に廃棄されることになりそうです。しかし、子供向けに Scratch だけ動けば良いと考えれば、これらのノートパソコンもまだまだ使えそうです。

そこで、古いノートパソコンを使って、小学校低学年でも Scratch でプログラミングできるようになれば面白そうだと思いました。家に古いノートパソコンがあれば費用は限りなくゼロに近いのでお得です。

Windows7はもう使えないので子供用といえどもお勧めできないので、OSは最新のものが使えて無料の Linux がよさそうです。そこで、子供用にLinuxマシンを使えるようにするにはどうするかを考えてみました。

使用した古いノートパソコンは、

 プロセッサーが AMD E-450 1.65GHz で、メモリ 2GB

のものです。

OSは、軽量の Linux ディストリビューションということで Xubuntu にしました。その下で動くブラウザはもちろん Google Chrome ですね。

https://xubuntu.org/ から ISO イメージをダウンロードしてインストールします。今回試したバージョンは 18.04 です。インストール方法は色々なところで書かれているので省略します。

(例えば、こちら。 https://kb.seeck.jp/archives/11949 )

そのときユーザを登録しますが、そのユーザが管理者となります。このユーザを管理者または保護者が使うわけです。

Xubuntu がインストールできたら、先ほど登録したユーザでログインします。

最初に Google Chrome をインストールします。Xubuntu にログインして、ブラウザから Google Chrome をダウンロードします。64bit 版なら、

google-chrome-stable_current_amd64.deb

というファイルがダウンロードされます。このファイルのアイコン(「ホーム」の中の「ダウンロード」の中にあります)をダブルクリックするとインストール用の、【google-chrome-stable】ウィンドウが開きますので、「インストール」をクリックすればインストールが始まります。

Google Chrome がインストールできたら、いよいよ Scratch を使えるように設定を行います。

このマシンを小学校低学年でもつかえるようにするためには、

・ 電源スイッチを入れて、簡単にログインできる。
・ ログインしたら自動的にブラウザを開いて Scratch サイトを開く。
・ 簡単にシャットダウンできる。
・ 日本語入力はキーボードに書いてあるかなによる入力。

にしておくのがよさそうです。早速設定してみます。

**********

まずは、新たに子供用のユーザ名を設定しましょう。OSは Linux ですから、子供がノートパソコンを使用していてもネットワークから ssh でログインして制御可能です。子供用と管理者のユーザ名は分けておくのがよさそうです。

1)画面左上のアイコンをクリックして、「設定」→「ユーザとグループ」を選択して【ユーザの設定】ウィンドウを開きます。

2)「追加」をクリックして、【新しいユーザの作成】ウィンドウを開きます。
「名前」にログイン画面に表示される名前を、「ユーザ名」は、Linux で使うユーザ名です。名前を指定したら、「OK」をクリックします。

3)【ユーザのパスワードの更新】ウィンドウが開いたら、念のために、「パスワードを手動で設定する」を選んで、「新しいパスワード」と「パスワードの確認」に同じパスワードを設定します。パスワードは通常通り複雑にしておきます。ここで、子供向けに「ログインの時にパスワードを尋ねない」を有効にします。これで子供用ユーザ名はパスワードなしでログインできます。

4)【ユーザの設定】ウィンドウに戻って、「アカウントの種類:」の右側の「変更」をクリックすると、【ユーザ・アカウントの種類を変更】ウィンドウが開くので、「デスクトップ・ユーザ」を選びます。これは、他のユーザに影響を与える変更は出来ない、設定だそうです。最後に「閉じる」をクリックしてウィンドウを閉じます。

**********

ここからは、子供用アカウントでログインします。パスワードなしでログインできます。

5)初めてログインすると、Google Chrome は左上のアイコンをクリックしてメニューを表示しても見当たりません。検索窓で google といれると、Google Chrome が見つかります。アイコンを右クリックして、「ディスクトップに追加」と「パネルに追加」をクリックします。生成されたディスクトップのアイコンはダブルクリックで開き、画面上部のラインであるパネルの右端に表示されるアイコンはクリックで開きます。低学年の子供はパネルの方がよさそうです。

6)最初に Google Chrome を開くと、「Chrome を規定のプラウザにする」と「使用統計データと障害レポートをGoogleに自動送信します」の指定の確認画面になるので、決めたら「OK」をクリックします。

7)もし、「新しいキーリングのパスワード設定」の画面が表示されたら、何もしないでそのまま「続行」をクリックします。

8)「Chromeへようこそ」タブの右横をクリックして「新しいタブ」を表示させ、「Chromeへようこそ」タブを消します。"scratch" と検索して、Scratch のホームページ、

Scratch - Imagine, Program, Share
( https://scratch.mit.edu/ )

を開きます。自動的に日本語画面になります。

9)Scratch のホームページを開いたら、ここで Chrome を開くと自動的に Scratch の画面が開くように設定します。

 Scratchのページを表示したまま、右上の「縦の…」アイコンをクリックして、メニューから「設定」をクリックします。 chrome://settings というタブが開きます。この画面の一番下の方に「起動時」の設定があります。そこで、「特定のページまたはページセットを開く」を選択すると、「現在のページを使用」を選択できるようになるのでそちらを選択すれば、Scrachの URL が表示されます。

10)Chrome を再起動して設定を確認したら、全画面表示にしてから終了すると、次回も全画面表示になります。子供向けにはこちらの設定が良いと思います。これで Chrome の設定は完了です。

11)小学校低学年の子供のために、ログインしたら Chrome が自動的に起動するように設定します。実行できれば全画面表示になりますので、市販されている Scratch の本の通りになるので分かりやすいです。

 「設定」をクリックして「セッションと起動」をクリックすると、【セッションと起動】ウィンドウが開きます。

 まず「一般」タグで、「ログアウトの設定」の「ログアウト時に受動的にセッションを保存する」を選択し、「ログアウト時に確認する」を外します。
 「自動開始アプリケーション」タグで「追加」をクリックすると、【アプリケーションの追加】ウィンドウが表示されます。「名前」に Google Chrome 、「説明」に Chrome ブラウザ 、「コマンド」に

 /usr/bin/google-chrome -stable %U

を指定して、「OK」をクリックします。ログアウトして再度ログインして設定を確認してみましょう。パスワードなしでログインすると、すぐに Scratch が使えるようになりました。

**********

さて、Linux で子供にとってやっかいなのはシャットダウンです。ここは、電源ボタンを押すと自動的にシャットダウンできるようにする設定を選びました。Xubuntuでは次のような設定でそれを実現できます。

12)管理者用のユーザでログインします。「設定」から「電源管理」をクリックすると、【Xfes電源管理】ウィンドウが開きます。「電源ボタンがおされたときシャットダウン」を選択して、【閉じる」をクリックします。シャットダウンできることを確認しましょう。

この設定で問題点は、chrome を実行したままシャットダウンすると、次回ログインして chrome を実行すると、復元に関するメッセージがでることです。子供用には難しいので、

使用時に「必ず右上の「×」ボタンをクリックして chrome を終わらせてから、電源ボタンを押して電源停止(シャットダウン)する」ように教えましょう。その際、「このサイトを離れますか?」と表示されることがあるので、「このページを離れる」(青い部分)をクリックするように教えれば良さそうです。このように Xubuntu で chrome を使っていて予期しないメッセージが出ると大抵漢字を含んでいるので、使用開始直後は各メッセージを確認して、この場合はここをクリックするなどの注意点をまとめておきましょう。

**********

Scratchではメッセージが表示できますが、メッセージを日本語で入力する必要がでてきます。そのとき、小学校低学年の子供にローマ字漢字入力は難しいので、ノートブックのキーボードに刻印されているひらがなによる入力がよさそうです。

13)「設定」をクリックして、「Mozcの設定」をクリックすると、【Mozcプロパティ】ウィンドウが開きます。「一般」タグの中で、「ローマ字入力・かな入力」で「ローマ字入力」になっているところを「かな入力」に変換して、「OK」をクリックします。これでキーボードのかなによる入力ができるようになります。

**********

以上で、古いノートパソコンを Scratch 用のコンピュータにする設定は終了です。Chrome のインストールと設定以外、Xubuntu の提供する「設定」機能だけですべての作業ができました。Linux をあまり意識しなくても作業できるわけです。

小学校低学年の子供用には、Scratch の「作る」をクリックして現れる「プロジェクトをつくる」のブロックもひらがなにする必要があります。地球儀のようなアイコンをクリックして、メニューから「にほんご」をクリックしましょう。この選択は保存されるので、次回からはひらがなのブロックになります。

**********

使用する子供にコンピュータの電源の入れ方と終了方法を教えて、実際に使わせてみましょう。最初に教える必要があるのがマウス操作です。

ノートパソコンはタッチパッドが付いているので、両手操作が良いかもしれません。

・「カーソル」を教えて、右の人差し指によるカーソルの移動を教えます。場所によってカーソルの形が変わることも説明します。

・「カーソル」による「クリック」の仕方は、カーソルを移動して左の人差し指で左ボタンを押すというのはどうでしょう。これで「チュートリアル」の「×」をクリックしてチュートリアルを閉じることができます。

・ブロックで大切なものは「ドラッグ」操作です。カーソルを移動して、左の人差し指で左ボタンを押しながら右の人差し指でカーソルを移動して、所定の場所で左ボタンから指を離すことでドラッグ動作を教えるのも良いかもしれません。

Scratch プログラムで特に教える必要があるのは、メッセージや数字の入力方法です。ノートパソコンの場合は、

・ブロック中のメッセージや数字のますの中をクリックします。

・「Delete」キーを押して内容をすべて消してカーソルをますから外します。

・数字や英文字の場合はそのまま、ひらがなは「半角/全角」キーを押して、画面上のアイコンが変化するのを確認して入力してみます。入力できたら最後に「Enter」キーを押すと下線が消えることを説明します。

・濁点・半濁点の付け方を教えます。カタカナに変更するには、[Tabキーで選択]と表示されるのを確認して、「Tab」キーを何回か押してカタカナ[[全]カタカナ]を選択して入力できます。

・小文字の「っ」などの入力方法も教えます。

Scratchの本などではプログラムの保存を説明しています。保存されたプログラムは、/home/ユーザ名/ダウンロード ディレクトリ(ディスクトップのアイコンでいうと、「ホーム」アイコンの中の「ダウンロード」アイコンの中)の下に、

Scratchのプロジェクト(n).sb3

のような名前のファイルとして保存されます。ここで、nは通し番号です。必要に応じて名前の変更も可能です。

**********

Xubuntu では標準で sshd は動いていません。ssh でネットワークからこのマシンにログインするために、管理ユーザでログインして、sshd をインストールします。

$ sudo apt install openssh-server

これで、ncurses-term,openssh-server,openssh-sftp-server,ssh-import-id
がインストールされ、sshd がデーモンとして実行中になります。管理ユーザだけが ssh でログインできるようにするには、

/etc/ssh/sshd_config ファイルの中で、

AllowUsers ユーザ名 ユーザ名  ........

の行を追加すれば、許可するユーザを指定できます。この修正を反映するには、systemd で sshd のリスタートが必要です。

# sudo systemctl restart sshd

許可されないユーザでログインしようとすると、/var/log/auth.log にログが残ります。

日時 sshd[...]:User ユーザ名 from IPアドレス not allowed becase not listed in AllowUsers

子供の使用でノートパソコンを長く使うと目が悪くなると心配されますので、声を掛けても終了したがらない場合は、ssh でログインしてシャットダウンすることも可能です。

# sudo shutdown -h

Chromeを実行した状態でシャットダウンされるので、次回はメッセージが表示されて対応が必要になります。

**********

大学入学共通テストの英語試験で経済格差の影響が論議されていますが、小学校のプログラミング教育もコンピュータやネットワークが必要で、経済格差が心配です。ここはボランティアによる古いノートパソコンの活用によって、学童保育の場に配布するなどして、誰でも Scratch が気軽に使えるようにすると良いかもしれません。Linuxなので、学童保育などで休日に管理ボランティア(一週間無茶な使い方をして想定外の動作をするものを元に戻すなど)などすると色々知見が得られるのでなにかと役立ちそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

bashcheck シェルスクリプトの動作について

2014-10-15 23:56:45 | Bash
Shellshock 検証用に、bashcheck というシェルスクリプトが公開されています。

https://github.com/hannob/bashcheck/blob/master/bashcheck


使い方は、bashcheck ファイルを chmod で実行可能にして以下のように実行するだけです。

$ ./bashcheck [another_bash]

最初の引数で別の bash が指定できます。省略すると標準の bash で、こちらの環境では /usr/local/bin/bash です。

これを利用して、patch 25 から patch 30 までの bash 毎に実行してみました。

Bash version 4.3.0(1)-release

Variable function parser active, maybe vulnerable to unknown parser bugs
Vulnerable to CVE-2014-6271 (original shellshock)
Vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Vulnerable to CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.25(1)-release

Variable function parser active, maybe vulnerable to unknown parser bugs
Not vulnerable to CVE-2014-6271 (original shellshock)
Vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Vulnerable to CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.26(2)-release

Variable function parser active, maybe vulnerable to unknown parser bugs
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Vulnerable to CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.27(3)-release

Variable function parser pre/suffixed [%%, upstream], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Found non-exploitable CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Found non-exploitable CVE-2014-6277 (lcamtuf bug #1)
Found non-exploitable CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.28(2)-release

Variable function parser pre/suffixed [%%, upstream], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Found non-exploitable CVE-2014-6277 (lcamtuf bug #1)
Found non-exploitable CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.29(3)-release

Variable function parser pre/suffixed [%%, upstream], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Found non-exploitable CVE-2014-6278 (lcamtuf bug #2)


Bash version 4.3.30(4)-release

Variable function parser pre/suffixed [%%, upstream], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)


ちなみに、前回アップデートした pidora の /bin/bash はこのような結果です。


Bash version 4.2.48(1)-release

Variable function parser pre/suffixed [(), redhat], bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Found non-exploitable CVE-2014-6278 (lcamtuf bug #2)


となって、4.3.29 とほぼ同じです。具体的には、以下のような別のテストでワーニングになっています。

(4.3.29)
# env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}' /bad/bash43-29 -c :
x

(/bin/bash)
# env 'BASH_FUNC_x()'='() { _;}>_[$($())] { echo x;}' /bin/bash -c :
x

ちなみに、4.3.30 ではこのようになります。

# env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}' bash -c :
bash: x: line 0: syntax error near unexpected token `{'
bash: x: line 0: `x () { _;}>_[$($())] { echo x;}'
bash: error importing function definition for `x'
#

# env 'BASH_FUNC_x()'='() { _;}>_[$($())] { echo x;}' bash -c :
#

shellshock を切っ掛けに bash の脆弱性のテストを Pidora で行ってきましたが、Raspberry Pi でも十分テストに利用できますね。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Pidora における Bash の Shellshock アップデートについて

2014-10-14 01:06:49 | Raspberry Pi
前回 のBash 4.3 patch 28 の修正の後、patch 29 と patch 30 がでました。これを、 patch 28 をコンパイルしたディレクトリ(ここでは ./bash-4.3)に対して適用して、再コンパイルします。Raspberry Pi では、約 13 分でした。

patch 30 以降はパッチが出ていないため、Shellshock 問題は一応収束したようです。

さて、pidora としては、正式ではないですが、「チケット #1402(new defect)」が提供されています。

早速、適用してみます。ちなみに yum localinstall は、rpm ファイルをインストールするためのものです。

# /bin/bash --version | head -1
GNU bash, version 4.2.47(1)-release (armv6hl-koji-linux-gnu)
# cp /bin/bash bad/bash4.2.47
#
# yum localinstall -y http://pidora.ca/pidora/misc/bash-4.2.48-2.fc20.armv6hl.rpm
Loaded plugins: langpacks, refresh-packagekit
bash-4.2.48-2.fc20.armv6hl.rpm | 921 kB 00:14
Examining /var/tmp/yum-root-OYjh84/bash-4.2.48-2.fc20.armv6hl.rpm: bash-4.2.48-2.fc20.armv6hl
Marking /var/tmp/yum-root-OYjh84/bash-4.2.48-2.fc20.armv6hl.rpm as an update to bash-4.2.47-2.fc20.armv6hl
Resolving Dependencies
--> Running transaction check
---> Package bash.armv6hl 0:4.2.47-2.fc20 will be updated
---> Package bash.armv6hl 0:4.2.48-2.fc20 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Updating:
bash armv6hl 4.2.48-2.fc20 /bash-4.2.48-2.fc20.armv6hl 3.3 M

Transaction Summary
================================================================================
Upgrade 1 Package

Total size: 3.3 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction (shutdown inhibited)
Updating : bash-4.2.48-2.fc20.armv6hl 1/2
Cleanup : bash-4.2.47-2.fc20.armv6hl 2/2
Verifying : bash-4.2.48-2.fc20.armv6hl 1/2
Verifying : bash-4.2.47-2.fc20.armv6hl 2/2

Updated:
bash.armv6hl 0:4.2.48-2.fc20

Complete!
#
# /bin/bash --version | head -1
GNU bash, version 4.2.48(1)-release (armv6hl-koji-linux-gnu)

となります。これをテストすると、2) すなわち、

env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

が、以下のような結果になる以外は、4.3.30と同じ結果になります。

/bin/bash: warning: x: ignoring function definition attempt
/bin/bash: error importing function definition for `BASH_FUNC_x'
test

これは一応問題ないので、このままこの /bin/bash を利用してもよさそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Shellshockの検証用シェルスクリプトの動作について その2

2014-10-04 09:52:00 | Raspberry Pi
前回、5種類の Shellshock のテストシェルスクリプトの動作を示しましたが、追加分の動作をまとめてみます。

6) (CVE-2014-6278)
x_func='() { echo vulnerable; }' bash -c x_func



version 4.3.28
bash: x_func: command not found


version 4.2.47
vulnerable


version 4.3.25
vulnerable


version 4.3.26
vulnerable


version 4.3.27
bash43-27: x_func: command not found



7) (CVE-2014-6277、./test005-bad等はシェルスクリプトファイル名)
HTTP_COOKIE="() { x() { _; }; x() { _; } <<`perl -e '{print "A"x1000}'`; }" bash -c :


version 4.3.28 (何も出力されない)

version 4.2.47
./test005-bad: line 6: 4174 Segmentation fault HTTP_COOKIE="() { x() { _; }; x() { _; }


version 4.3.25
./test005-bad25: line 7: 4179 Segmentation fault HTTP_COOKIE="() { x() { _; }; x() { _; }


version 4.3.26
./test005-bad26: line 7: 4186 Segmentation fault HTTP_COOKIE="() { x() { _; }; x() { _; }


version 4.3.27 (何も出力されない)



8) (CVE-2014-7187、4.3は問題ないようです。)
(for x in {1..200} ; do echo "for x$x in ; do :"; done; for x in {1..200} ; do echo done ; done) | bash || echo "CVE-2014-7187 vulnerable, word_lineno"



version 4.3.28(何も出力されない)

version 4.2.47(何も出力されない)

version 4.3.25(何も出力されない)

version 4.3.26(何も出力されない)

version 4.3.27(何も出力されない)


9) (CVE-2014-6278)
x='() { _; } >_[$($())] { echo vulnerable; }' /usr/local/bin/bash -c "echo test"


version 4.3.28
test


version 4.2.47
vulnerable
test


version 4.3.25
vulnerable
test


version 4.3.26
vulnerable
test


version 4.3.27
test



10) (CVE-2014-7186、test009-bad 等はシェルスクリプトファイル名)
bash -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF' || echo "CVE-2014-7186 vulnerable, redir_stack"


version 4.3.28
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')


version 4.2.47
./test009-bad: line 7: 4300 Segmentation fault /bin/bash -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF'
CVE-2014-7186 vulnerable, redir_stack


version 4.3.25
./test009-bad25: line 7: 4305 Segmentation fault bash43-25 -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF'
CVE-2014-7186 vulnerable, redir_stack


version 4.3.26
./test009-bad26: line 7: 4309 Segmentation fault bash43-26 -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF'
CVE-2014-7186 vulnerable, redir_stack


version 4.3.27
./test009-bad27: line 7: 4313 Segmentation fault bash43-27 -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF'
CVE-2014-7186 vulnerable, redir_stack


10番目のテストが、bash 4.3.27 と bash 4.3.28 で動作が異なる場合です。4.3.27 までは Segmentation fault を起こしてしまいます。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Shellshock の検証用シェルスクリプトの動作について

2014-10-02 20:11:02 | Raspberry Pi
この記事を書く前に、bash 4.3 patch 28 が出ましたので、先にそちらを示します。

# wget get http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-028
# wget get http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-028.sig
# gpg2 --verify bash43-028.sig
gpg: Signature made Thu Oct 2 02:23:01 2014 JST using DSA key ID 64EA74AB
gpg: Good signature from "Chet Ramey <chet@cwru.edu>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7C01 35FB 088A AF6C 66C6 50B9 BB58 69F0 64EA 74AB
#

前回コンパイルしたbash-4.3 ディレクトリに対してこのパッチをあてます。事前に /usr/local/bin/bash は、bash43-27 として待避しておきます。修正ファイルは少ないので、Raspberry Pi でもすぐに再コンパイルできます。

# bash --version | head -1
GNU bash, version 4.3.27(1)-release (armv6l-unknown-linux-gnueabihf)
# cd bash-4.3
# patch -p0 <../bash43-028
patching file parse.y
patching file y.tab.c
Ignoring potentially dangerous file name ../bash-4.3/patchlevel.h
patching file patchlevel.h
# make
....................
# make install 2>&1 | tee Install.log
....................
#
# bash --version | head -1
GNU bash, version 4.3.28(2)-release (armv6l-unknown-linux-gnueabihf)

4.3.28(2)で、(2)となっているのは、一度コンパイルした後で、ソースファイルを修正してコンパイルした回数を表します。patch 27 まであてて一度コンパイルしてから、patch 28 をあてて再コンパイルしたので (2) です。

さて、前回、Shellshock 対策で、bash 4.3 patch 27 をインストールしましたが、ついでに Pidora 2014 のオリジナル /bin/bash と、patch 25 (bash 4.3.25) と patch 26 (bash 4.3.26) も作成して、公開されている 5種類の Shellshock のテストシェルスクリプトの動作をまとめてみました。


1) (CVE-2014-6271)
env 'x=() { :;}; echo vulnerable' bash -c "echo test"

version 4.3.27(1) patch 27 まで bash43-27
test


version 4.2.47(1) Pidora2014 オリジナル版 /bin/bash
vulnerable
test


version 4.3.25(1) patch 25 まで bash43-25
bash43-25: warning: x: ignoring function definition attempt
bash43-25: error importing function definition for `x'
test


version 4.3.26(1) patch 26 まで bash43-26
bash43-25: warning: x: ignoring function definition attempt
bash43-25: error importing function definition for `x'
test



2)
env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

version 4.3.27(1)
test


version 4.2.47(1)
vulnerable
/bin/bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
/bin/bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
/bin/bash: error importing function definition for `BASH_FUNC_x'
test


version 4.3.25(1)
bash43-25: warning: x: ignoring function definition attempt
bash43-25: error importing function definition for `x'
bash43-25: error importing function definition for `BASH_FUNC_x()'
test


version 4.3.26(1)
bash43-26: warning: x: ignoring function definition attempt
bash43-26: error importing function definition for `x'
bash43-26: error importing function definition for `BASH_FUNC_x()'
test



3) (CVE-2014-7186, ./test001-bad等はシェルスクリプトファイル名)
env 'f=() { :<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<k<<l<<m<<n
a
b
c
d
e
f
g
h
i
j
k
l
m
n
}' bash -c 'echo test'


version 4.3.27(1)
test


version 4.2.47(1)
./test001-bad: line 18: 26253 Segmentation fault env 'f=() { :<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<k<<l<<m<<n
a
b
c
d
e
f
g
h
i
j
k
l
m
n
}' /bin/bash -c 'echo test'


version 4.3.25(1)
./test001-bad25: line 18: 26270 Segmentation fault env 'f=() { :<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<k<<l<<m<<n
a
b
c
d
e
f
g
h
i
j
k
l
m
n
}' bash43-25 -c 'echo test'


version 4.3.26(1)
./test001-bad26: line 18: 26307 Segmentation fault env 'f=() { :<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<k<<l<<m<<n
a
b
c
d
e
f
g
h
i
j
k
l
m
n
}' bash43-26 -c 'echo test'



4)
bash -c "export f=1 g='() {'; f() { echo 2;}; export -f f; bash -c 'echo \$f \$g; f; env | grep ^f='"

version 4.3.27(1)
1 () {
2
f=1


version 4.2.47(1)
/bin/bash: g: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `g'
1
2
f=1
f=() { echo 2


version 4.3.25(1)
bash43-25: g: line 1: syntax error: unexpected end of file
bash43-25: error importing function definition for `g'
1
2
f=1
f=() { echo 2


version 4.3.26(1)
bash43-26: g: line 1: syntax error: unexpected end of file
bash43-26: error importing function definition for `g'
1
2
f=1
f=() { echo 2



5) (CVE-2014-7169)
cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo


version 4.3.27(1)
date
cat: /tmp/echo: No such file or directory


version 4.2.47(1)
/bin/bash: x: line 1: syntax error near unexpected token `='
/bin/bash: x: line 1: `'
/bin/bash: error importing function definition for `x'
Thu Oct 2 12:37:38 JST 2014


version 4.3.25(1)
bash43-25: x: line 1: syntax error near unexpected token `='
bash43-25: x: line 1: `'
bash43-25: error importing function definition for `x'
Thu Oct 2 12:38:09 JST 2014


version 4.3.26(1)
bash43-26: x: line 1: syntax error near unexpected token `='
bash43-26: x: line 1: `'
bash43-26: error importing function definition for `x'
date
cat: /tmp/echo: No such file or directory



今回調べきれなかったので、4.3.27 と 4.3.28 の違いを示すシェルスクリプトは見つかりませんでした。もちろん 4.3.28 は、上述の5つのテストすべて 4.3.27と同じ結果です。

Pidora 2014 と Raspberry Pi でも十分テストや検証ができることが分かります。やはり動作する Linux ディストリビューションの種類も豊富で、SDカード一枚で気軽にOSすら変更できる Raspberry Pi は、1台は手元に置いておきたいマシンですね。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Pidora2014における Shellshock (Bash の脆弱性)について

2014-09-29 23:21:36 | Raspberry Pi
Shellshock と呼ばれているbashの脆弱性ですが、Pidora2014 では正式にはまだ修正が行われていません。

# /bin/bash --version
GNU bash, version 4.2.47(1)-release (armv6hl-koji-linux-gnu)
.......
# date;yum update bash
Mon Sep 29 20:46:47 JST 2014
Loaded plugins: langpacks, refresh-packagekit
No packages marked for update
#  env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' \
           bash -c "echo test"
vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test
#

そこで、ソースからコンパイルすることにします。bash は、ほとんどのシステムで問題なくコンパイル可能ですので、pidora で問題ないでしょう。しかし、OpenSSLと異なり、最新バージョンの bash でも脆弱性は修正されていないため、パッチをあてる必要があります。bash のパッチは累積パッチが用意されておらず、各パッチが、patchlevel.h を毎回更新していく形式ですから、全てのパッチを001からあてていく必要があります。

4.2 のパッチ数が 50 、4.3 のパッチ数が 27 ですから、ここは bash-4.3 を /usr/local/bin にインストールするのが簡単そうです。

例えば、こんな感じです。

# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3.tar.gz
# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3.tar.gz.sig
# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-001
# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-001.sig
,,,,,
# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-027
# wget http://ftp.jaist.ac.jp/pub/GNU/bash/bash-4.3-patches/bash43-027.sig

pidora では、gpg ではなくて gpg2 が標準ですから、パブリックキー 0x64EA74AB をインポートしてから、以下のようにチェックできます。

# gpg2 --verify bash-4.3.tar.gz.sig
gpg: Signature made Tue Feb 25 23:36:04 2014 JST using DSA key ID 64EA74AB
gpg: Good signature from "Chet Ramey <chet@cwru.edu>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7C01 35FB 088A AF6C 66C6 50B9 BB58 69F0 64EA 74AB
#


同様に27個のパッチを入手してチェックします。

用意できたら、コンパイルしてみます。

# tar xvf bash-4.3.tar.gz
# cd bash-4.3
# patch -p0 <../bash43-001
-bash: patch: command not found

となってしまいました。patch をインストールします。

# yum install patch
......

準備ができましたのでパッチをあてます。

# patch -p0 <../bash43-001
Ignoring potentially dangerous file name ../bash-4.3/test.c
patching file test.c
Ignoring potentially dangerous file name ../bash-4.3/patchlevel.h
patching file patchlevel.h

# grep '#define PATCHLEVEL' patchlevel.h
#define PATCHLEVEL 1

# patch -p0 <../bash43-002
......
# patch -p0 <../bash43-027

# grep '#define PATCHLEVEL' patchlevel.h
#define PATCHLEVEL 27

# ./configure
.....
# make (約16分)
....
# make install 2>&1 |tee Install.log
...
# which bash
/usr/local/bin/bash
# bash --version
GNU bash, version 4.3.27(1)-release (armv6l-unknown-linux-gnueabihf)
..............
#


先ほどのテストを行ってみます。

# env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' \
bash -c "echo test"

test
#

脆弱性は解消できました。インターネットに直接接続するような場合は、/bin/bash を待避して、作成した/usr/local/bin/bash をコピーする必要があります。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする