
BloodHound OpenGraph collector for GitHub जो संगठन संरचना, अनुमतियों और क्रॉस-क्लाउड आक्रमण पथों को सुरक्षा ऑडिट और घटना प्रतिक्रिया के लिए एक नेविगेबल ग्राफ में मैप करता है।

GitHound GitHub के लिए एक BloodHound OpenGraph कलेक्टर है, जो आपके संगठन की संरचना और अनुमतियों को एक नेविगेट करने योग्य हमले-पथ ग्राफ में मैप करने के लिए डिज़ाइन किया गया है। यह:
मुख्य GitHub संस्थाओं का मॉडल बनाता है
BloodHound में विज़ुअलाइज़ और विश्लेषण करें
GitHound के साथ, आपको अपने GitHub अनुमति परिदृश्य का एक स्पष्ट, इंटरैक्टिव ग्राफ मिलता है—जो सुरक्षा समीक्षाओं, अनुपालन ऑडिट और त्वरित घटना जांच के लिए एकदम सही है।
विस्तृत दस्तावेज़ीकरण के लिए, देखें BloodHound Docs - GitHound.
# 1. Load the collector
. ./githound.ps1
# 2. Create a session with your Personal Access Token
$session = New-GitHubSession -OrganizationName "YourOrgName" -Token (Get-Clipboard)
# 3. Run the collection
Invoke-GitHound -Session $session
# 4. Upload the resulting githound_<orgId>.json file to BloodHound
यदि संग्रह बाधित होता है, तो जहाँ से छोड़ा था वहाँ से फिर से शुरू करें:
Invoke-GitHound -Session $session -Resume
GitHound व्यक्तिगत पहुँच टोकन सत्र और GitHub ऐप इंस्टॉलेशन सत्र दोनों का समर्थन करता है। मौजूदा संगठन-स्कोप्ड GitHub ऐप वर्कफ़्लो अपरिवर्तित है:
. ./githound.ps1
$session = New-GitHubJwtSession `
-OrganizationName "YourOrgName" `
-ClientId $clientId `
-PrivateKeyPath $privateKeyPath `
-InstallationId $installationId
Invoke-GitHound -Session $session -CollectAll
वही फ़ंक्शन एंटरप्राइज़-सक्षम सत्र भी बना सकता है:
. ./githound.ps1
$session = New-GitHubJwtSession `
-EnterpriseName "YourEnterpriseSlug" `
-ClientId $clientId `
-PrivateKeyPath $privateKeyPath `
-InstallationId $installationId `
-PersonalAccessToken $pat
एंटरप्राइज़-सक्षम सत्र लौटाए गए GitHound.Session पर कई प्रमाणीकरण संदर्भ बनाए रखते हैं:
Headers: सामान्य संग्रह के लिए उपयोग किए जाने वाले GitHub ऐप इंस्टॉलेशन टोकन हेडरJwtHeaders: उपयोगकर्ता एप्लिकेशन-स्तरीय एंडपॉइंट के लिए उपयोग किए जाने वाले GitHub ऐप JWT हेडर जैसे इंस्टॉलेशन गणनाPatHeaders: उन संग्रह पथों के लिए वैकल्पिक व्यक्तिगत पहुँच टोकन हेडर जिनमें उपयोगकर्ता-टोकन प्रमाणीकरण की आवश्यकता होती हैप्रमाणित GitHub ऐप से संबंधित इंस्टॉलेशनों की गणना करने के लिए:
Get-GitHubAppInstallation -Session $session |
Select-Object TargetType, InstallationId, Login, Name, SuspendedAt
वर्कफ़्लो पार्सिंग अब Invoke-GitHound में बनाया गया है जब आप -CollectAll का उपयोग करते हैं। कलेक्टर करेगा:
GH_Workflow नोड और वर्कफ़्लो सामग्री एकत्र करेगाGH_WorkflowJob और GH_WorkflowStep में विश्लेषण करेगाGH_CanPwnRequest और GH_CanDispatchTo की गणना करेगाgithound_<orgId>.json आउटपुट में मर्ज करेगारिज्यूम/डिबगिंग उद्देश्यों के लिए, मध्यवर्ती वर्कफ़्लो-विश्लेषण चेकपॉइंट को githound_WorkflowAnalysis_<orgId>.json के रूप में लिखा जाता है।
GitHound में अब Git-HoundEnterprise के माध्यम से एक न्यूनतम एंटरप्राइज़ संग्रह नींव शामिल है। वह कलेक्टर वर्तमान में बनाता है:
GH_EnterpriseGH_Organization स्टब नोडGH_Contains किनारेGit-HoundEnterpriseUser के माध्यम से एंटरप्राइज़ उपयोगकर्ता संग्रह जोड़ता है:
GH_UserGH_HasMember किनारेGit-HoundEnterpriseSamlProvider के माध्यम से एंटरप्राइज़ SAML संग्रह जोड़ता है:
GH_SamlIdentityProviderGH_ExternalIdentityGH_HasSamlIdentityProviderइस पथ के लिए PAT-समर्थित सत्र की आवश्यकता होती है क्योंकि GitHub एंटरप्राइज़ SAML को enterprise.ownerInfo के माध्यम से उजागर करता है।
Git-HoundEnterpriseTeam के माध्यम से एंटरप्राइज़ टीम संग्रह जोड़ता है:
GH_EnterpriseTeamGH_AssignedTo किनारेent: GH_Team नोड्स तक GH_MemberOf किनारे (प्रॉपर्टी मैचिंग का उपयोग करके)members भूमिकाएँ और उपयोगकर्ताओं से उन भूमिकाओं तक GH_HasRole किनारेGit-HoundEnterpriseRole के माध्यम से एंटरप्राइज़ भूमिका संग्रह जोड़ता है:
GH_EnterpriseRoleGH_Contains किनारेGH_HasRole किनारेएंटरप्राइज़.ownerInfo.admins से भरा एक डिफ़ॉल्ट owners रोल, जब PAT-समर्थित एंटरप्राइज़ एडमिन डेटा उपलब्ध होफिलहाल, कच्ची एंटरप्राइज़ अनुमति स्ट्रिंग्स को GH_EnterpriseRole नोड पर उसके permissions प्रॉपर्टी में समर्पित अनुमति किनारों में विस्तारित करने के बजाय संरक्षित किया जाता है।
एंटरप्राइज़ SCIM संग्रह वर्तमान में जोड़ता है:
SCIM_UserSCIM_GroupSCIM_User से GH_ExternalIdentity तक SCIM_ProvisionedSCIM_Group से GH_EnterpriseTeam तक SCIM_Provisioned जब GitHub एंटरप्राइज़ टीम group_id उजागर करता हैSCIM_User से SCIM_Group तक SCIM_MemberOfयह GitHound को साझा SCIM स्कीमा से GitHub के मूल एंटरप्राइज़ पहचान और टीम मॉडल में प्रदाता-अज्ञेय पुल देता है।
जब एकत्रित GH_SamlIdentityProvider ऊपरी IdP की पहचान करता है, तो GitHound SCIM साइडकार आउटपुट के अंदर प्रदाता-जागरूक SCIM सहसंबंध किनारे भी जोड़ सकता है:
Okta_User -> SCIM_User
Okta_User.id = SCIM_User.externalId द्वारा मिलानOkta_Group -> SCIM_Group
Okta_Group.name = SCIM_Group.externalId द्वारा मिलानOkta_Group.oktaDomain = GH_SamlIdentityProvider.foreign_environmentidGitHound SCIM परत को अपने स्वयं के साइडकार आउटपुट में रखता है ताकि ये मैपिंग दिखाई देती रहें बिना SCIM-मूल नोड्स को मुख्य GitHub-मूल एंटरप्राइज़ ग्राफ में मिलाए:
githound_<entId>.json में एंटरप्राइज़ GitHub-मूल डेटा होता हैgithound_scim_<entId>.json में SCIM-मूल नोड और SCIM ब्रिज किनारे होते हैंgithound_saml_<entId>.json में SAML और बाहरी पहचान डेटा होता हैgithound_hybrid_<entId>.json में क्रॉस-मॉडल किनारे जैसे SAML_Implements, SAML_HasAccount, और GH_SyncedTo होते हैंgithound_saml_<entId>.json में GitHub सेवा प्रदाता के लिए सामान्यीकृत SAML टोपोलॉजी भी शामिल है, जिसमें SAML_TrustsIssuer और SAML_HasAssertionConsumerService शामिल हैंमूल GitHub पहचान-प्रदाता मॉडल GitHub/SAML-मूल आउटपुट में अक्षुण्ण रहता है:
GH_ExternalIdentityGH_HasExternalIdentityGH_MapsToUsergithound_hybrid_<entId>.json में सामान्यीकृत SAML परत अब SAML_HasAccount को सीधे GH_User पर रखती है, जबकि लिंक किए गए GH_ExternalIdentity SAML-मुख गुणों जैसे saml_identity_name_id और saml_identity_username से match_values प्राप्त करती है।
एंटरप्राइज़ संग्रह द्वारा उत्सर्जित GH_Organization स्टब्स को जानबूझकर collected = false के रूप में चिह्नित किया गया है। वे एंटरप्राइज़ संदर्भ से संरचनात्मक खोज का प्रतिनिधित्व करते हैं और बाद में सामान्य संगठन संग्रह द्वारा समृद्ध किए जाने के लिए हैं।
एंटरप्राइज़-प्रथम ऑर्केस्ट्रेशन के लिए, Invoke-GitHoundEnterprise समर्थित एंटरप्राइज़-स्कोप डेटा एकत्र करेगा, संबंधित संगठन इंस्टॉलेशनों की गणना करेगा, और फिर चुने गए चेकपॉइंट पथ के तहत प्रत्येक संगठन के लिए अपनी उपनिर्देशिका में मौजूदा Invoke-GitHound वर्कफ़्लो चलाएगा।
उदाहरण:
$session = New-GitHubJwtSession `
-EnterpriseName "your-enterprise-slug" `
-ClientId $clientId `
-PrivateKeyPath $privateKeyPath `
-InstallationId $enterpriseInstallationId `
-PersonalAccessToken $pat
Invoke-GitHoundEnterprise -Session $session -CheckpointPath "./output/your-enterprise" -CollectAll
संबंधित संगठनों की गणना किए बिना केवल एंटरप्राइज़ परीक्षण के लिए:
Invoke-GitHoundEnterprise -Session $session -CheckpointPath "./output/your-enterprise" -EnterpriseOnly

विस्तृत दस्तावेज़ीकरण के लिए, देखें BloodHound Docs - GitHound Schema.
प्रमुख एज श्रेणियाँ:
प्राथमिक हमले पथ पैटर्न:
(:GH_User)-[:GH_HasRole|GH_MemberOf|GH_AddMember*1..]->(:GH_RepoRole)-[:GH_AdminTo|GH_CanPush]->(:GH_Repository)
अपने लक्ष्य उपयोगकर्ता के लिए ऑब्जेक्ट आइडेंटिफ़ायर खोजें:
MATCH (n:GH_User)
RETURN n
संकेत: तालिका लेआउट चुनें
https://github.com/user-attachments/assets/1ddfd075-2a15-4aa9-bad7-74c43e6c82d6
निम्नलिखित क्वेरी में <object_id> मान को उपयोगकर्ता के ऑब्जेक्ट आइडेंटिफ़ायर से बदलें:
MATCH p = (:GH_User {objectid:"<object_id>"})-[:GH_MemberOf|GH_AddMember|GH_HasRole|GH_HasBaseRole|GH_Owns*1..]->(:GH_RepoRole)-[:GH_WriteRepoContents]->(:GH_Repository)
RETURN p

अपने लक्ष्य रिपॉजिटरी के लिए ऑब्जेक्ट आइडेंटिफ़ायर प्राप्त करें:
MATCH (n:GH_Repository)
RETURN n
अपने लक्ष्य रिपॉजिटरी के लिए ऑब्जेक्ट आइडेंटिफ़ायर लें और निम्नलिखित क्वेरी में <object_id> मान को उससे बदलें:
MATCH p = (:GH_User)-[:GH_MemberOf|GH_HasRole|GH_HasBaseRole|GH_Owns|GH_AddMember*1..]->(:GH_RepoRole)-[:GH_WriteRepoContents]->(:GH_Repository {objectid:"<object_id>"})
RETURN p

MATCH p = (:GH_User)-[:GH_HasRole|GH_HasBaseRole]->(:GH_OrgRole {short_name: "owners"})
RETURN p

MATCH p = (:AZUser)-[:GH_SyncedTo]->(:GH_User)
RETURN p

GitHub संस्थाएँ खोजें जो Azure फ़ेडरेटेड पहचान (OIDC विश्वास संबंध) ग्रहण कर सकती हैं:
// All GitHub → Azure OIDC attack paths
MATCH p = (:GH_Repository|GH_Branch|GH_Environment)-[:GH_CanAssumeIdentity]->(:AZFederatedIdentityCredential)
RETURN p
// Users with paths to Azure via GitHub Actions
MATCH p = (:GH_User)-[:GH_HasRole|GH_MemberOf|GH_AddMember*1..]->(:GH_RepoRole)-[:GH_CanPush]->(:GH_Repository)-[:GH_CanAssumeIdentity]->(:AZFederatedIdentityCredential)
RETURN p
MATCH p = (:GH_Repository)-[:GH_HasSecret]->(:GH_OrgSecret)
RETURN p
MATCH p = (:GH_Repository)-[:GH_Contains]->(:GH_SecretScanningAlert)
RETURN p
हम आपके योगदान का स्वागत करते हैं और उनकी सराहना करते हैं! प्रक्रिया को सुचारू और कुशल बनाने के लिए, कृपया इन चरणों का पालन करें:
अपने विचार पर चर्चा करें
फ़ोर्क करें और एक शाखा बनाएं
इस रिपॉजिटरी को अपने खाते में फ़ोर्क करें।
अपने काम के लिए एक विषय शाखा बनाएं:
git checkout -b feat/my-new-feature
कार्यान्वित करें और परीक्षण करें
रिपॉजिटरी में मौजूदा शैली और पैटर्न का पालन करें।
अपने परिवर्तनों को कवर करने के लिए कोई भी परीक्षण/उदाहरण जोड़ें या अपडेट करें।
सत्यापित करें कि आपका कोड अपेक्षित रूप से काम करता है:
# e.g. dot-source the collector and run it, or load the model.json in BloodHound
एक पुल अनुरोध सबमिट करें
अपनी शाखा को अपने फ़ोर्क पर पुश करें:
git push origin feat/my-new-feature
इस रिपॉजिटरी के main शाखा के विरुद्ध एक पुल अनुरोध खोलें।
अपने PR विवरण में, कृपया शामिल करें:
समीक्षा और मर्ज
इस विस्तार को बेहतर बनाने में मदद करने के लिए धन्यवाद! 🎉
Copyright 2025 Jared Atkinson
Licensed under the Apache License, Version 2.0
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
जब तक कि निचले स्तर की LICENSE फ़ाइल या लाइसेंस हेडर द्वारा अन्यथा चिह्नित न किया गया हो, इस रिपॉजिटरी में सभी फ़ाइलें Apache-2.0 लाइसेंस के तहत जारी की जाती हैं। लाइसेंस की एक पूरी प्रति शीर्ष-स्तरीय LICENSE फ़ाइल में पाई जा सकती है।
| श्रेणी | प्रमुख एज | विवरण |
|---|
| समाहितीकरण | GH_Contains, GH_Owns | संगठनात्मक पदानुक्रम |
| भूमिका असाइनमेंट | GH_HasRole, GH_MemberOf, GH_HasBaseRole | किसके पास कौन सी भूमिकाएँ हैं |
| रिपॉजिटरी अनुमतियाँ | GH_AdminTo, GH_CanPush, GH_CanPull | भूमिकाएँ क्या कर सकती हैं |
| शाखा सुरक्षाएँ | GH_BypassPullRequestAllowances, GH_RestrictionsCanPush | शाखा-स्तरीय पहुंच |
| रहस्य | GH_HasSecret | रहस्य पहुंच मैपिंग |
| क्रॉस-क्लाउड | GH_CanAssumeIdentity, GH_SyncedTo | Azure/AWS पर हमले के पथ |