Monday, 21 November 2016

[Sec|Django] Social media fingerprinting

Mới đây một website đã được tung ra để tự động hiển thị những trang mạng xã hội mà người dùng đã login vào. Việc này trông có vẻ đầy hư cấu và có cảm giác mình bị "hack", thế nhưng nó không phải là mới, dựa trên một lỗ hổng bảo mật mà nhiều hãng không thèm fix. Nó có tên "Social media fingerprinting".

https://robinlinus.github.io/socialmedia-leak/#updates


Cơ chế để trang này hoạt động rất đơn giản:
  • Nếu website X cho phép redirect tới một địa chỉ (đặc biệt) khác thì tức là user đã đăng nhập.
  • Nếu không redirect được đến địa chỉ đó thì có vẻ như user chưa đăng nhập hoặc site đã fix lỗi.
Bật firefox console lên và F5 lại sẽ thấy rất nhiều URL được sử dụng để check social media finger print. Nếu bạn chạy Firefox
ở Private mode, Firefox sẽ chặn các kết nối này để đảm bảo bạn không bị track


Địa chỉ ở đây không phải địa chỉ nào cũng được mà phải là link đến 1 file ảnh ( same origin policy ).
Một số website chỉ cho phép redirect đến URL có cùng domain với URL hiện tại (vd Facebook.com), và nếu như site đó sử dụng CDN (tức các file ảnh đều ở trên một domain khác - do CDN cung cấp) thì có một cái ảnh người ta vẫn thường để cùng host đó là file favicon.ico.
Một số URL được sử dụng tại trang web:
  • https://www.reddit.com/login?dest=https%3A%2F%2Fwww.reddit.com%2Ffavicon.ico
  • https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Ffavicon.ico%3Fid%3D1
  • https://accounts.google.com/ServiceLogin?service=blogger&hl=de&passive=1209600&continue=https://www.blogger.com/favicon.ico
  • https://www.dropbox.com/login?cont=https%3A%2F%2Fwww.dropbox.com%2Fstatic%2Fimages%2Fabout%2Fdropbox_logo_glyph_2015.svg
  • https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Ffavicon.ico&uilel=3&hl=en&service=youtube
  • https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.google.com%2Ffavicon.ico&uilel=3&hl=en&service=mail
  • https://www.airbnb.com/login?redirect_params[action]=favicon.ico&redirect_params[controller]=home
  • https://slack.com/checkcookie?redir=https%3A%2F%2Fslack.com%2Ffavicon.ico%23
  • https://secure.meetup.com/login/?returnUri=https%3A%2F%2Fwww.meetup.com%2Fimg%2Fajax_loader_trans.gif
Django 1.10 đưa ra tính năng mới cho phép người dùng redirect tới 1 URL bất kỳ cùng domain, vậy nên nếu user redirect tới file favicon.ico trên cùng site mà thành công thì nghĩa là đã check được user đã login hay chưa - dính lỗi social media leak.
https://www.djangoproject.com/weblog/2016/nov/01/security-releases/

Cách giải quyết đơn giản nhất là host tất cả các static file sang một domain khác, và không cho domain này vào ALLOWED_HOSTS, khi đó nếu hacker sử dụng phương pháp check nói trên sẽ gặp lỗi.

https://github.com/django/django/commit/10781b4c6ff981f581157957d221e7621e0bf4ed#diff-c571286052438b2e3190f8db8331a92bR53

def _get_login_redirect_url(request, redirect_to):
    # Ensure the user-originating redirection URL is safe.
    if not is_safe_url(url=redirect_to, host=request.get_host()):
        return resolve_url(settings.LOGIN_REDIRECT_URL)
    return redirect_to
Nếu bạn có viết một Django app và thực hiện việc cho phép user redirect, bạn sẽ cần thêm đoạn code check is_safe_url như trên để không bị social media leak.

Không chỉ Django, bất cứ đoạn code hay framework nào cho phép user redirect dựa trên việc đã login hay chưa đều có thể dính lỗi "social media leak".

Cách phòng chống:  disable third party cookies.
Khi người ta vẫn chưa quan tâm đến tính riêng tư (privacy) thì những lỗi như thế này vẫn còn lâu lâu mới được fix hết.

Hết.
HVN at http://www.familug.org and  http://pymi.vn