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

Ivan Vyshnevskyi - Not So Quiet git push

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

OWASP Kyiv

December 03, 2017
Tweet

More Decks by OWASP Kyiv

Other Decks in Technology

Transcript

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

    View Slide

  2. Відмова від відповідальності
    “They are not a security people, they’re a developer people […]”
    — Bryan Brake, подкаст “Brakeing Down Security”
    2

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

  5. 5

    View Slide

  6. 6

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. Ціль: статичний сайт
    ● Персональний блог
    ● Cайт-візитка
    ● Документація для нашого F(L)OSS проекту
    ● Сторінка для JavaScript експериментів
    10

    View Slide

  11. Ціль: статичний сайт
    ● Дешево
    ● Мінімум інфраструктури
    ● Легко оновлювати
    ● Пишемо не чистий HTML (Markdown чи AsciiDoc)
    11

    View Slide

  12. GitHub Pages
    12

    View Slide

  13. GitHub Pages v1.0
    13
    автор https://example.github.io
    ➀ зміни ➂ хостинг
    GitHub
    ➁ генерація
    (Jekyll)

    View Slide

  14. GitHub Pages v2.0
    14
    автор https://example.github.io
    ➀ зміни
    GitHub
    Travis CI
    ➃ хостинг
    ➂ генерація та
    публікація
    ➁ отримання змін

    View Slide

  15. GitHub Pages: Auth
    15

    View Slide

  16. GitHub Pages: Auth
    16

    View Slide

  17. GitHub Pages: Auth
    17

    View Slide

  18. Публікація з Travis CI
    18
    .travis.yml
    sudo: false
    script:
    - ./build.sh # генерує і коммітить в public
    - cd public
    - ???

    View Slide

  19. Публікація: спроба #1
    19
    .travis.yml:L5
    - git push
    https://[email protected]/$TRAVIS_REPO_SLUG
    HEAD:gh-pages

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. Публікація: спроба #2
    26
    .travis.yml:L5
    - git push --quiet
    https://[email protected]/$TRAVIS_REPO_SLUG
    HEAD:gh-pages

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. Публікація: спроба #3
    34
    .travis.yml:L5
    - git push --quiet
    https://[email protected]/$TRAVIS_REPO_SLUG
    HEAD:gh-pages > /dev/null

    View Slide

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

    View Slide

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

    View Slide

  37. git push усіх версії
    виводить помилки
    в stderr, не stdout
    37

    View Slide

  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

    View Slide

  39. Підсумок
    ● Щоб працювати з git безпечно треба бути обережним
    ○ Хороші рішення знайти так само легко як і погані
    ● Доступні для всіх логи не спрощують задачу
    39

    View Slide

  40. II. Історія
    40

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  44. 2014 — Знайомство
    ● Простий пошук по ‘git push https’
    ● Перегляд вручну логів
    Результат: ~10 токенів (активних і ні)
    44

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. 2016 — Перші результати
    ● 28 активних токенів
    51

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  55. 2016 — Книга облич
    exec('git clone '+
    'https://[email protected]/'+repoSlug+' '+
    factsFolder);
    // ...
    exec('git push origin');
    55

    View Slide

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

    View Slide

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

    View Slide

  58. 2016 — Книга облич
    58
    ● Можна писати статтю! :-)
    ● Баг баунті? Вуд лов ту, бат…
    ○ «Не можна зв’язуватися з працівниками з питань повідомлення
    безпосередньо або через інші канали.»
    ○ Помилка вже виправлена

    View Slide

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

    View Slide

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

    View Slide

  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.

    View Slide

  62. 2016 — Книга облич
    62
    … award you a bounty of $X000

    View Slide

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

    View Slide

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

    View Slide

  65. 2017 — Скан
    65

    View Slide

  66. 2017 — Скан
    66
    JavaScript: робота з API Travis CI
    Bash: менджмент вводу/виводу
    ¯\_(ツ)_/¯

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  70. 2017 — Скан: репозиторії
    70

    View Slide

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

    View Slide

  72. 2017 — Скан: білди
    72
    Деякі проекти використовують Travis CI наповну
    ● інколи десятки тисяч білдів
    ● кожен білд має десятки джоб логів

    View Slide

  73. 2017 — Скан: білди
    73
    ● тільки останні 3000 білдів
    ● не більше 10 логів на білд
    ○ завжди останній та перший
    ○ 8 випадкових

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  77. III. Результати
    77

    View Slide

  78. Хвилинка статистики (1)
    78
    Скан
    ● 7.8 мільйонів репозиторіїв на 326 мовах
    ● 320 тис. з них мали хоча б один білд на Travis CI
    ~4.1%!
    ● 60 мільйонів білдів

    View Slide

  79. Хвилинка статистики (2)
    79
    Результати
    ● 150 тис. білдів в яких щось знайшлись
    ~0.24% від усіх
    ● 2.6 тис. унікальних токенів
    ● 907 активних токенів (34%)

    View Slide

  80. 907 Активних токенів
    80

    View Slide

  81. 81

    View Slide

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

    View Slide

  83. 83

    View Slide

  84. 84

    View Slide

  85. 85

    View Slide

  86. 86

    View Slide

  87. 87

    View Slide

  88. 88

    View Slide

  89. 89

    View Slide

  90. 90

    View Slide

  91. 91

    View Slide

  92. 92

    View Slide

  93. 93

    View Slide

  94. 94

    View Slide

  95. 95

    View Slide

  96. 96

    View Slide

  97. 97

    View Slide

  98. 98

    View Slide

  99. 99

    View Slide

  100. 100

    View Slide

  101. 101

    View Slide

  102. 102

    View Slide

  103. 103

    View Slide

  104. 104

    View Slide

  105. 105

    View Slide

  106. 106

    View Slide

  107. 107

    View Slide

  108. 108

    View Slide

  109. 109

    View Slide

  110. 110

    View Slide

  111. 111

    View Slide

  112. 112

    View Slide

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

    View Slide

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

    View Slide

  115. disclosure
    115

    View Slide

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

    View Slide

  117. Disclosure: а чому не…
    117
    [email protected]
    ● Travis CI
    ● GitHub Security
    ● напряму власникам

    View Slide

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

    View Slide

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

    View Slide

  120. Disclosure: моменти
    120
    ● виявилось, це займає дуже багато часу
    ● важко визначити кому писати
    ● Google Security Team — круті

    View Slide

  121. Disclosure: фінал
    121

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  125. Дякую за увагу
    125
    [email protected]
    @sainaen
    Іван Вишневський

    View Slide

  126. PS. Не git push єдиним
    ● set -x
    ● git remote -v
    ● echo
    126

    View Slide

  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

    View Slide