almost 4 years ago

上篇: Secure Your Application : The Basic (3)

7. Same secret token

Rails project 裡的 config/initializers/secret_token.rb 這個檔案。裡面的 secret_token 是用來 verify signed cookie 的。在產生 Rails project 時,每個 project 也都會生一把不同的 key...

狀況 1 : fork opensource project

不過如果你的 project 不是你產生的,而是 Github 上 clone 的呢?那麼有 99% 的機率,你這個 application 已經暴露在高度風險之上。

  • clone 的人忘記跑 rake secrect 產生一把全新的。
  • opensource 的人忘記把 secret_token.rb 設進去 .gitignore
  • google://secret_token.rb site:github.com 超精彩...

狀況 2 : opensource project owner

  • opensource 的人忘記把 secret_token.rb 設進去 .gitignore
  • 而且 production 用的就是這一把...

該檢查的地方以及怎麼處理

  • 如果你的 application 是從 github 上 fork 下來的。抓下來第一件事就是砍 secret_token.rb,重跑 rake secrect
  • 如果你是 opensource project 維護者,發布之前,請砍掉 secret_token.rb,設進 .gitignore,然後換 key。
  • Redmine 的作法是預設移除,然後設進 .gitignore
  • Discourse 的作法是保留,但用 condition 設定 production 和 development 跑不同的 token,production 跑的是環境變數:ENV[‘SECRET_TOKEN’]

8. scopes

很多 Application 是這種常見的設計,利用一個 check_permission 去應付多種狀況。

class TopicsController < ApplicationController
  before_filter :login_required
  before_filter :check_permission, :only => [:edit]
  def edit
    @topic = Post.find(params[:id])
  end
end

但是 check_permission 的狀況很容易不小心寫漏了,就能夠進到該頁面。

問題與解法

  • by case 設計在 controller 不是好解法,因為 helper / view 有時候也需要類似邏輯
  • 邏輯經過幾次擴充之後就變成漿糊了。擴充了 Controller 忘記改 View ...etc.
  • 改用 Cancan 這種 Rule Engine 式的設計方法,全上黑名單,再一個一個設白名單解開,而且寫一次可以套用在所有地方。

9. Upgrades

Rails 在 3.2.11 前的版本,都有一個致命漏洞:可以被 Remote code execution。Remote code execution 表示攻擊者可以對你的 application 你的 server 作 任何事

原理詳見:http://blog.codeclimate.com/blog/2013/01/10/rails-remote-code-execution-vulnerability-explained/

基本上只要這個洞還留著。其他地方再怎麼防都沒有用

解法

  • 升級到 3.2.11+


Recap

Security 是一件讓人很頭痛的事。Rails 的 core member : Aaron Patterson 就曾經抱怨,其實他最討厭處理 securtiy
事件。

  • 因為,attacker 不會主動回報,就算它跟你講了,你也不知道這個洞已經多久了
  • 即便他好心跟你講(寫信到 Rails security mailing list),你也只有「很短」的時間修。很短可能是幾天,也可能是幾小時,但總之...火會燒得超級快。每次遇到資安事件,security team 的人就不用睡了...
  • patch 得馬上得 Release。不同於其他 feature release,feature release 都會有時間公測。唯有 security patch 沒有這個時間。而這種 patch 最危險的是不保證會不會炸了其他沒問題的地方。(某次 patch 炸了 Github ...)
  • 你努力了拯救了整個世界,但沒人會感謝你。但如果你寫的 patch 炸爛了大家的 production,肯定一堆人角你...

洞是真的防不慎防的。

有時候就算框架本身是沒問題的。但是還是會因為人為疏失被摸進去。

不過如果是人為疏失,其實還是有幾招可以降低發生的機率:

  1. 注意使用者塞給你的東西 Pay attention of user geneate content
  2. 不要繞過 Rails 的預設機制 Avoid bypass default design
  3. 盡量套用 Rails 4 的新機制 Apply new features introduce by Rails 4
  4. 不要忘記更新 Don’t forgot to upgrade


全集連結:

投影片:http://xdite.github.io/security-basic

← Secure Your Application : The Basic (3) Logdown 現在支援 Custom Theme 了! →
 
comments powered by Disqus