Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ivan Vyshnevskyi - Not So Quiet git push

28e7d7d55dc88f37db36bfb2f24c6310?s=47 OWASP Kyiv
December 03, 2017

Ivan Vyshnevskyi - Not So Quiet git push

Video: https://youtu.be/IOgaqMctP_g
OWASP Kyiv Winter 2017 Meetup, Dec 2, 2017
https://www.owasp.org/index.php/Kyiv

28e7d7d55dc88f37db36bfb2f24c6310?s=128

OWASP Kyiv

December 03, 2017
Tweet

Transcript

  1. Not so Quiet git push All your repository are belong

    to us
  2. Відмова від відповідальності “They are not a security people, they’re

    a developer people […]” — Bryan Brake, подкаст “Brakeing Down Security” 2
  3. 3

  4. 4

  5. 5

  6. 6

  7. 7 Модель загроз

  8. План I. Проблема II. Історія III.Результати 8

  9. I. Проблема 9

  10. Ціль: статичний сайт • Персональний блог • Cайт-візитка • Документація

    для нашого F(L)OSS проекту • Сторінка для JavaScript експериментів 10
  11. Ціль: статичний сайт • Дешево • Мінімум інфраструктури • Легко

    оновлювати • Пишемо не чистий HTML (Markdown чи AsciiDoc) 11
  12. GitHub Pages 12

  13. GitHub Pages v1.0 13 автор https://example.github.io ➀ зміни ➂ хостинг

    GitHub ➁ генерація (Jekyll)
  14. GitHub Pages v2.0 14 автор https://example.github.io ➀ зміни GitHub Travis

    CI ➃ хостинг ➂ генерація та публікація ➁ отримання змін
  15. GitHub Pages: Auth 15

  16. GitHub Pages: Auth 16

  17. GitHub Pages: Auth 17

  18. Публікація з Travis CI 18 .travis.yml sudo: false script: -

    ./build.sh # генерує і коммітить в public - cd public - ???
  19. Публікація: спроба #1 19 .travis.yml:L5 - git push https://$GH_TOKEN@github.com/$TRAVIS_REPO_SLUG HEAD:gh-pages

  20. Публікація: спроба #1 20

  21. Публікація: спроба #1 21

  22. Публікація: спроба #1 22

  23. git push до v2.9.3 виводить повний URL 23

  24. Публікація: спроба #2 24

  25. Публікація: спроба #2 25 man git-push

  26. Публікація: спроба #2 26 .travis.yml:L5 - git push --quiet https://$GH_TOKEN@github.com/$TRAVIS_REPO_SLUG

    HEAD:gh-pages
  27. Публікація: спроба #2 27

  28. Публікація: спроба #2 28

  29. Публікація: спроба #2 29

  30. Публікація: спроба #2 30

  31. Публікація: спроба #2 31 man git-push #again

  32. git push усіх версії виводить повний URL при помилці 32

  33. Публікація: спроба #3 33

  34. Публікація: спроба #3 34 .travis.yml:L5 - git push --quiet https://$GH_TOKEN@github.com/$TRAVIS_REPO_SLUG

    HEAD:gh-pages > /dev/null
  35. Публікація: спроба #3 35 git push --quiet $URL HEAD:gh-pages >

    /dev/null fatal: unable to access 'https://df479efa868fbb679ce954fad0ce2c7c3dffd92e@github.com/sai naen/hypothetical-blog/': Failed to connect to github.com port 443: Connection refused
  36. Публікація: спроба #3 36 git push --quiet $URL HEAD:gh-pages >

    /dev/null fatal: unable to access 'https://df479efa868fbb679ce954fad0ce2c7c3dffd92e@github.com/sai naen/hypothetical-blog/': Failed to connect to github.com port 443: Connection refused
  37. git push усіх версії виводить помилки в stderr, не stdout

    37
  38. Публікація: ще варіанти? 38 • повний /dev/null git push $URL

    HEAD:gh-pages 2>&1 > /dev/null • credentials helper git config credential.helper 'store --file=.git/creds' • ~/.netrc echo "machine github.com login $LOGIN password $GH_TOKEN" > ~/.netrc
  39. Підсумок • Щоб працювати з git безпечно треба бути обережним

    ◦ Хороші рішення знайти так само легко як і погані • Доступні для всіх логи не спрощують задачу 39
  40. II. Історія 40

  41. 2014 — Знайомство 41

  42. 2014 — Знайомство 42

  43. 2014 — Знайомство • Простий пошук по ‘git push https’

    • Перегляд вручну логів 43
  44. 2014 — Знайомство • Простий пошук по ‘git push https’

    • Перегляд вручну логів Результат: ~10 токенів (активних і ні) 44
  45. 2014 — Знайомство В одному з листів, я написав: “[This

    problem] doesn't seem to be very common […]” 45
  46. 2014 — Знайомство В одному з листів, я написав: “[This

    problem] doesn't seem to be very common […]” Ха! 46
  47. 2016 — Повернення 47 • Хочеться свій блог • Перший

    пост має бути про щось цікаве
  48. 2016 — Повернення 48 • Хочеться свій блог • Перший

    пост має бути про щось цікаве Проблема з git push
  49. 2016 — Повернення 49 • Всього 10 токенів якось малувато

    • Можливо за два роки все змінилось? • Потенційна шкода, якщо проблема більш поширена
  50. 2016 — Повернення 50 • Всього 10 токенів якось малувато

    • Можливо за два роки все змінилось? • Потенційна шкода, якщо проблема більш поширена Рішення: ще раз пройтись пошуком
  51. 2016 — Перші результати • 28 активних токенів 51

  52. 2016 — Перші результати • 28 активних токенів • часткова

    автоматизація завантаження логів 52
  53. 2016 — Перші результати • 28 активних токенів • часткова

    автоматизація завантаження логів ◦ знаючи ім’я репозиторію, навіть якщо він «деактивований» на Travis CI, логи все ще можна отримати ◦ у випадку проблем з git push який знаходиться в after_success секції, білд залишається «зеленим» 53
  54. 2016 — Перші результати • 28 активних токенів • часткова

    автоматизація завантаження логів ◦ знаючи ім’я репозиторію, навіть якщо він «деактивований» на Travis CI, логи все ще можна отримати ◦ у випадку проблем з git push який знаходиться в after_success секції, білд залишається «зеленим» • ‘coordinated’ та інші види disclosure 54
  55. 2016 — Книга облич exec('git clone '+ 'https://$GH_TOKEN@github.com/'+repoSlug+' '+ factsFolder);

    // ... exec('git push origin'); 55
  56. 2016 — Книга облич 56 • Можна писати статтю! :-)

  57. 2016 — Книга облич 57 • Можна писати статтю! :-)

    • Баг баунті? Офкорс!
  58. 2016 — Книга облич 58 • Можна писати статтю! :-)

    • Баг баунті? Вуд лов ту, бат… ◦ «Не можна зв’язуватися з працівниками з питань повідомлення безпосередньо або через інші канали.» ◦ Помилка вже виправлена
  59. 2016 — Книга облич 59 • Thank you for reporting

    this information to us.
  60. 2016 — Книга облич 60 • Thank you for reporting

    this information to us.
  61. 2016 — Книга облич 61 • Thank you for reporting

    this information to us. • After reviewing this issue, we have decided to award you a bounty of $X000.
  62. 2016 — Книга облич 62 … award you a bounty

    of $X000
  63. 2016 — Книга облич 63

  64. 2016 — Книга облич 64

  65. 2017 — Скан 65

  66. 2017 — Скан 66 JavaScript: робота з API Travis CI

    Bash: менджмент вводу/виводу ¯\_(ツ)_/¯
  67. 2017 — Скан: репозиторії 67 • популярні (>100 зірочок чи

    форків)
  68. 2017 — Скан: репозиторії 68 • популярні (>100 зірочок чи

    форків) • проекти відомих компаній (Google, Mozilla, Facebook, etc.)
  69. 2017 — Скан: репозиторії 69 • популярні (>100 зірочок чи

    форків) • проекти відомих компаній (Google, Mozilla, Facebook, etc.) • проекти топ-коммітерів до проектів зібраних раніше
  70. 2017 — Скан: репозиторії 70

  71. 2017 — Скан: репозиторії 71 • популярні (>100 зірочок чи

    форків) • проекти відомих компаній (Google, Mozilla, Facebook, etc.) • проекти топ-коммітерів до проектів зібраних раніше • проекти коммітерів до проектів топ-коммітерів
  72. 2017 — Скан: білди 72 Деякі проекти використовують Travis CI

    наповну • інколи десятки тисяч білдів • кожен білд має десятки джоб логів
  73. 2017 — Скан: білди 73 • тільки останні 3000 білдів

    • не більше 10 логів на білд ◦ завжди останній та перший ◦ 8 випадкових
  74. 2017 — Скан: час 74 • ~4 місяці ◦ щоб

    не забанили мій сервер ◦ не створювати проблем для безкоштовного сервісу
  75. 2017 — Скан: час 75 • ~4 місяці ◦ щоб

    не забанили мій сервер ◦ не створювати проблем для безкоштовного сервісу • дуже важко не сидіти і тупо дивитись як біжать рядочки
  76. 2017 — Скан: час 76 • ~4 місяці ◦ щоб

    не забанили мій сервер ◦ не створювати проблем для безкоштовного сервісу • дуже важко не сидіти і тупо дивитись як біжать рядочки • постійний збір нових «цілей»
  77. III. Результати 77

  78. Хвилинка статистики (1) 78 Скан • 7.8 мільйонів репозиторіїв на

    326 мовах • 320 тис. з них мали хоча б один білд на Travis CI ~4.1%! • 60 мільйонів білдів
  79. Хвилинка статистики (2) 79 Результати • 150 тис. білдів в

    яких щось знайшлись ~0.24% від усіх • 2.6 тис. унікальних токенів • 907 активних токенів (34%)
  80. 907 Активних токенів 80

  81. 81

  82. 82 цікаві проекти

  83. 83

  84. 84

  85. 85

  86. 86

  87. 87

  88. 88

  89. 89

  90. 90

  91. 91

  92. 92

  93. 93

  94. 94

  95. 95

  96. 96

  97. 97

  98. 98

  99. 99

  100. 100

  101. 101

  102. 102

  103. 103

  104. 104

  105. 105

  106. 106

  107. 107

  108. 108

  109. 109

  110. 110

  111. 111

  112. 112

  113. 113 158 тис. репозиторіїв з комміт-доступом

  114. 114 20 тис. приватних репозиторіїв

  115. disclosure 115

  116. Disclosure: порядок 116 1. газети/журнали/онлайн видання 2. державні організації 3.

    великі компанії 4. індивідуальні розробники
  117. Disclosure: а чому не… 117 • git-security@ • Travis CI

    • GitHub Security • напряму власникам
  118. Disclosure: моменти 118 • виявилось, це займає дуже багато часу

  119. Disclosure: моменти 119 • виявилось, це займає дуже багато часу

    • важко визначити кому писати
  120. Disclosure: моменти 120 • виявилось, це займає дуже багато часу

    • важко визначити кому писати • Google Security Team — круті
  121. Disclosure: фінал 121

  122. Висновки 122 • “given enough eyeballs, all bugs are shallow”

    — не працює, токени в логах були роками навіть у великих проектів
  123. Висновки 123 • “given enough eyeballs, all bugs are shallow”

    — не працює, токени в логах були роками навіть у великих проектів • якщо програма поводиться несподівано, документацію не прочитають
  124. Висновки 124 • “given enough eyeballs, all bugs are shallow”

    — не працює, токени в логах були роками навіть у великих проектів • якщо програма поводиться несподівано, документацію не прочитають • копі-паста коду з Інтернету, як завжди, не допомогає
  125. Дякую за увагу 125 hi@sainaen.com @sainaen Іван Вишневський

  126. PS. Не git push єдиним • set -x • git

    remote -v • echo 126
  127. PPS. Виправимо git-push! - error(_("failed to push some refs to

    '%s'"), transport->url); + error(_("failed to push some refs to '%s'"), transport_anonymize_url(transport- >url)); “This leaks the return value.” :-( 127