炸蝦碎碎念。

[Notes, GNU/Linux, Open Source, Ruby on Rails, Computer Science, Archlinux]

[Rails] Taipei.rb 心得 Rails 安全的過去與現在

紀錄一下今天參加的活動。本來想要邊聽邊打的後來懶惰就沒打了。把記得的東西補紀錄一下。

主題:Rails 安全的過去與現在

地點:五倍紅寶石

講者:Shaolin

先講結論(Shaolin 大大真的先講結論 XD)

Rails 因為設計良好,很難寫出常見的漏洞。通常出事都是工程師太雷(權限之類)或者是不是 Rails 的錯(shaolin 大大表示:Rails 網站好難打),今天講了幾個案例。

歷史案例 - Mass Assignment

Rails 出過最大的包大概就是 Mass assignment 的漏洞,在 GitHub 的 rails/rails 塞了一個 commit 。

四年前發生的,因為這個 Rails 界應該很多人都知道,講者也沒講很多。我就提供當初 xdite 的兩篇文章給大家參考一下,大家就加減看。

從 Github 被 hack,談 Rails 的安全性( mass-assignment )

Strong Parameter: Mass Assignment 機制的防彈衣

基本上這個現在早就被修掉了。如果很多人一開始學就是 Rails 4 ,可能根本沒遇過這個。

在 GitHub 上面的 Session Secret

Rails 的 Session 預設是存在 Cookie 裡的。實做方式是把 Session 的 Hash 用 base64 encode 之後,再用 secret key 跟 base64 string 做 Sinature 防只有心人士惡意竄改。

所以 config/secrets.yml 如果一不小心被 git add 了,然後被 push 到 GitHub 上公開的 Repo 的話,就可以被拿去偽造。就算你事後刪掉,git 的紀錄都還是留的下來。

我的作法是一開始就把他加到 .gitignore ,然後複製預設的到 secrets.yml.example 。自己用的那套再用 rake secret 重新生。

可以參考這篇:How to hack a Rails app using its secret_token

Dynamic Render Path

在 Rails Controller 裡面,如果你這樣做:

1
2
3
4
def index
  page = params[:page] || 'index'
  render page
end

這樣你下 /some_controller/index?page=foo 他就會去找 foo.html.erb 。那如果你下 /some_controller/index?page=/etc/passwd 就很有可能輕鬆 GET /etc/passwd

shaolin 提供了一個很有趣的 hack ,因為 rails 預設的 template engine 是 erb ,所以如果你在 content type 裡加上奇怪的東西,比如說<%= `params[:cmd]` %>,再用前面的方法去 load log/production.log ,從此之後,你就可以輕鬆執行任何指令了。這個 bug 也已經修掉了,現在預設的 template engine 是純文字。但是這種寫法還是很不好,因為其他檔案都被看光光。我看了一下我的網站,幸好有類似作法的都是用 if 去判斷某幾種參數,不然就跳到 fallback。

參考講者公司的 Blog 文章: Rails 動態樣板路徑的風險

Imagetragick

網頁常常會用到 ImageMagick ,因為常常會用到上傳圖片等等功能。在很多常用的 Gem 裡都有包含。比如說carrierwave、paperclip、RMagick、mini magick。

因為這些會去執行到 shell 指令,概念就是 convert a.png out.jpg | ls -la 之類的。這是很新的 bug (CVE-2016-3714),所以要趕快更新 ImageMagick。

還有網站專門講這個的 ImageTragick // Make ImageMagick Great Again XDDDDDD

SQL Injection

講者還講了很多 Rails 的 SQL Injection 。其實 Rails 的 SQL Injection 防的不錯,剩下的其實都蠻難湊出來的。

有個網站有整理:Rails SQL Injection

Comments