mirror of
https://github.com/DISARMFoundation/DISARMframeworks.git
synced 2025-05-02 14:56:04 -04:00
Copy AMITT repository, clean up and rebrand
Took a copy of the current AMITT github repository - we'll be updating this and merging the SPICE branch back in Rebranded to DISARM Moved generated pages to their own folder, to make looking at the repository less confusing
This commit is contained in:
commit
22abaf93d8
448 changed files with 58066 additions and 0 deletions
BIN
DISARM_DOCUMENTATION/.DS_Store
vendored
Normal file
BIN
DISARM_DOCUMENTATION/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/00_AMITT_Design_Guide_version1.pdf
Normal file
BIN
DISARM_DOCUMENTATION/00_AMITT_Design_Guide_version1.pdf
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/01_AMITT_TTP_Guide.pdf
Normal file
BIN
DISARM_DOCUMENTATION/01_AMITT_TTP_Guide.pdf
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/02_Proposed_Changes_to_AMITT.pdf
Normal file
BIN
DISARM_DOCUMENTATION/02_Proposed_Changes_to_AMITT.pdf
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/03_AMITT_Use_Cases.pdf
Normal file
BIN
DISARM_DOCUMENTATION/03_AMITT_Use_Cases.pdf
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/04_AMITT_Incident_List.pdf
Normal file
BIN
DISARM_DOCUMENTATION/04_AMITT_Incident_List.pdf
Normal file
Binary file not shown.
BIN
DISARM_DOCUMENTATION/05_AMITT_User_Guide.pdf
Normal file
BIN
DISARM_DOCUMENTATION/05_AMITT_User_Guide.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_Counters_MASTER.xlsx
Normal file
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_Counters_MASTER.xlsx
Normal file
Binary file not shown.
|
@ -0,0 +1,459 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Create counters summaries\n",
|
||||
"Create summaries of disinfo countermeasures for use in dataset cleaning etc."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Writing ../counter_tactics/ALcounters.md\n",
|
||||
"Writing ../counter_tactics/TA01counters.md\n",
|
||||
"Writing ../counter_tactics/TA02counters.md\n",
|
||||
"Writing ../counter_tactics/TA03counters.md\n",
|
||||
"Writing ../counter_tactics/TA04counters.md\n",
|
||||
"Writing ../counter_tactics/TA05counters.md\n",
|
||||
"Writing ../counter_tactics/TA06counters.md\n",
|
||||
"Writing ../counter_tactics/TA07counters.md\n",
|
||||
"Writing ../counter_tactics/TA08counters.md\n",
|
||||
"Writing ../counter_tactics/TA09counters.md\n",
|
||||
"Writing ../counter_tactics/TA10counters.md\n",
|
||||
"Writing ../counter_tactics/TA11counters.md\n",
|
||||
"Writing ../counter_tactics/TA12counters.md\n",
|
||||
"updated ../counter_tactic_counts.md\n",
|
||||
"Writing ../counters_metatag/cleaningcounters.md\n",
|
||||
"Writing ../counters_metatag/countermessagingcounters.md\n",
|
||||
"Writing ../counters_metatag/data pollutioncounters.md\n",
|
||||
"Writing ../counters_metatag/daylightcounters.md\n",
|
||||
"Writing ../counters_metatag/dilutioncounters.md\n",
|
||||
"Writing ../counters_metatag/diversioncounters.md\n",
|
||||
"Writing ../counters_metatag/frictioncounters.md\n",
|
||||
"Writing ../counters_metatag/metatechniquecounters.md\n",
|
||||
"Writing ../counters_metatag/reduce resourcescounters.md\n",
|
||||
"Writing ../counters_metatag/removalcounters.md\n",
|
||||
"Writing ../counters_metatag/resiliencecounters.md\n",
|
||||
"Writing ../counters_metatag/scoringcounters.md\n",
|
||||
"Writing ../counters_metatag/targetingcounters.md\n",
|
||||
"Writing ../counters_metatag/verificationcounters.md\n",
|
||||
"updated ../counter_metatag_counts.md\n",
|
||||
"Writing ../counter_resource/DHScounters.md\n",
|
||||
"Writing ../counter_resource/NGOcounters.md\n",
|
||||
"Writing ../counter_resource/activistscounters.md\n",
|
||||
"Writing ../counter_resource/adtechcounters.md\n",
|
||||
"Writing ../counter_resource/civil_societycounters.md\n",
|
||||
"Writing ../counter_resource/community_groupscounters.md\n",
|
||||
"Writing ../counter_resource/companiescounters.md\n",
|
||||
"Writing ../counter_resource/content_creatorscounters.md\n",
|
||||
"Writing ../counter_resource/data_scientistcounters.md\n",
|
||||
"Writing ../counter_resource/datastreamscounters.md\n",
|
||||
"Writing ../counter_resource/developerscounters.md\n",
|
||||
"Writing ../counter_resource/educatorscounters.md\n",
|
||||
"Writing ../counter_resource/elvescounters.md\n",
|
||||
"Writing ../counter_resource/factcheckerscounters.md\n",
|
||||
"Writing ../counter_resource/fundingcounters.md\n",
|
||||
"Writing ../counter_resource/gamesdesignerscounters.md\n",
|
||||
"Writing ../counter_resource/governmentcounters.md\n",
|
||||
"Writing ../counter_resource/government:policymakerscounters.md\n",
|
||||
"Writing ../counter_resource/influencerscounters.md\n",
|
||||
"Writing ../counter_resource/influencers:trusted_authoritycounters.md\n",
|
||||
"Writing ../counter_resource/infoseccounters.md\n",
|
||||
"Writing ../counter_resource/librariescounters.md\n",
|
||||
"Writing ../counter_resource/mediacounters.md\n",
|
||||
"Writing ../counter_resource/militarycounters.md\n",
|
||||
"Writing ../counter_resource/moneycounters.md\n",
|
||||
"Writing ../counter_resource/platform_admincounters.md\n",
|
||||
"Writing ../counter_resource/platform_admin:adtechcounters.md\n",
|
||||
"Writing ../counter_resource/platform_admin:fundingsitescounters.md\n",
|
||||
"Writing ../counter_resource/platform_admin:socialmediacounters.md\n",
|
||||
"Writing ../counter_resource/platform_algorithmscounters.md\n",
|
||||
"Writing ../counter_resource/platform_outreachcounters.md\n",
|
||||
"Writing ../counter_resource/platformscounters.md\n",
|
||||
"Writing ../counter_resource/publiccounters.md\n",
|
||||
"Writing ../counter_resource/public:account_ownerscounters.md\n",
|
||||
"Writing ../counter_resource/religious_organisationscounters.md\n",
|
||||
"Writing ../counter_resource/schoolscounters.md\n",
|
||||
"Writing ../counter_resource/server_admincounters.md\n",
|
||||
"updated ../counter_resource_counts.md\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div>\n",
|
||||
"<style scoped>\n",
|
||||
" .dataframe tbody tr th:only-of-type {\n",
|
||||
" vertical-align: middle;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe tbody tr th {\n",
|
||||
" vertical-align: top;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .dataframe thead th {\n",
|
||||
" text-align: right;\n",
|
||||
" }\n",
|
||||
"</style>\n",
|
||||
"<table border=\"1\" class=\"dataframe\">\n",
|
||||
" <thead>\n",
|
||||
" <tr style=\"text-align: right;\">\n",
|
||||
" <th></th>\n",
|
||||
" <th>ID</th>\n",
|
||||
" <th>metatechnique</th>\n",
|
||||
" <th>Title</th>\n",
|
||||
" <th>Details</th>\n",
|
||||
" <th>Playbook(s)</th>\n",
|
||||
" <th>Resources needed</th>\n",
|
||||
" <th>How found</th>\n",
|
||||
" <th>References</th>\n",
|
||||
" <th>Incidents</th>\n",
|
||||
" <th>Tactic</th>\n",
|
||||
" <th>Response</th>\n",
|
||||
" <th>Techniques</th>\n",
|
||||
" <th>NOTES</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>C00043</td>\n",
|
||||
" <td>cleaning</td>\n",
|
||||
" <td>Detect hijacked accounts and reallocate them</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>In all playbooks the platform must force user ...</td>\n",
|
||||
" <td>platform_admin,activists,civil_society,money</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA03 Develop People</td>\n",
|
||||
" <td>D3 Disrupt</td>\n",
|
||||
" <td>T0011 - Hijack accounts</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>C00053</td>\n",
|
||||
" <td>cleaning</td>\n",
|
||||
" <td>Delete old accounts / Remove unused social med...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>Social media companies remove inactive account...</td>\n",
|
||||
" <td>platform_admin,platform_admin:socialmedia,publ...</td>\n",
|
||||
" <td>2019-11-workshop,2019-11-search</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>I00004</td>\n",
|
||||
" <td>TA04 Develop Networks</td>\n",
|
||||
" <td>D4 Degrade</td>\n",
|
||||
" <td>T0011 - Hijack accounts\\nTA06 - Develop Conten...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>C00074</td>\n",
|
||||
" <td>cleaning</td>\n",
|
||||
" <td>Identify identical content and mass deplatform</td>\n",
|
||||
" <td>\\n</td>\n",
|
||||
" <td>In all cases some checks need to prevent depla...</td>\n",
|
||||
" <td>platform_admin,platform_admin:socialmedia</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA06 Develop Content</td>\n",
|
||||
" <td>D2 Deny</td>\n",
|
||||
" <td>T0022 - Conspiracy narratives\\nT0026 - Create ...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>C00026</td>\n",
|
||||
" <td>countermessaging</td>\n",
|
||||
" <td>Shore up democracy based messages (peace, free...</td>\n",
|
||||
" <td>Unsure</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA01 Strategic Planning</td>\n",
|
||||
" <td>D4 Degrade</td>\n",
|
||||
" <td>T0002 - Facilitate State Propaganda</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>C00082</td>\n",
|
||||
" <td>countermessaging</td>\n",
|
||||
" <td>Ground truthing as automated response to pollu...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA06 Develop Content</td>\n",
|
||||
" <td>D3 Disrupt</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>...</th>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>181</th>\n",
|
||||
" <td>C00214</td>\n",
|
||||
" <td>metatechnique</td>\n",
|
||||
" <td>Create policy that makes social media police d...</td>\n",
|
||||
" <td>German model: facebook forced to police conten...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>government:policymakers</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA07 Channel Selection</td>\n",
|
||||
" <td>D3 Disrupt</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>182</th>\n",
|
||||
" <td>C00215</td>\n",
|
||||
" <td>metatechnique</td>\n",
|
||||
" <td>Use fraud legislation to clean up social media</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>government:policymakers</td>\n",
|
||||
" <td>2019-11-workshop</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA07 Channel Selection</td>\n",
|
||||
" <td>D3 Disrupt</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>183</th>\n",
|
||||
" <td>C00217</td>\n",
|
||||
" <td>daylight</td>\n",
|
||||
" <td>Registries alert when large batches of newsy U...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>platform_admin</td>\n",
|
||||
" <td>grugq</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA07 Channel Selection</td>\n",
|
||||
" <td>D2 Deny</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>184</th>\n",
|
||||
" <td>C00218</td>\n",
|
||||
" <td>removal</td>\n",
|
||||
" <td>Censorship</td>\n",
|
||||
" <td>Alter and/or block the publication/disseminati...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>platform_admin</td>\n",
|
||||
" <td>grugq</td>\n",
|
||||
" <td>Taylor81</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA09 Exposure</td>\n",
|
||||
" <td>D2 Deny</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>185</th>\n",
|
||||
" <td>C00219</td>\n",
|
||||
" <td>daylight</td>\n",
|
||||
" <td>Add metadata to content - out of the control o...</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>Add date and source to images</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>grugq</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>TA06 Develop Content</td>\n",
|
||||
" <td>D3 Disrupt</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"<p>186 rows × 13 columns</p>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" ID metatechnique \\\n",
|
||||
"0 C00043 cleaning \n",
|
||||
"1 C00053 cleaning \n",
|
||||
"2 C00074 cleaning \n",
|
||||
"3 C00026 countermessaging \n",
|
||||
"4 C00082 countermessaging \n",
|
||||
".. ... ... \n",
|
||||
"181 C00214 metatechnique \n",
|
||||
"182 C00215 metatechnique \n",
|
||||
"183 C00217 daylight \n",
|
||||
"184 C00218 removal \n",
|
||||
"185 C00219 daylight \n",
|
||||
"\n",
|
||||
" Title \\\n",
|
||||
"0 Detect hijacked accounts and reallocate them \n",
|
||||
"1 Delete old accounts / Remove unused social med... \n",
|
||||
"2 Identify identical content and mass deplatform \n",
|
||||
"3 Shore up democracy based messages (peace, free... \n",
|
||||
"4 Ground truthing as automated response to pollu... \n",
|
||||
".. ... \n",
|
||||
"181 Create policy that makes social media police d... \n",
|
||||
"182 Use fraud legislation to clean up social media \n",
|
||||
"183 Registries alert when large batches of newsy U... \n",
|
||||
"184 Censorship \n",
|
||||
"185 Add metadata to content - out of the control o... \n",
|
||||
"\n",
|
||||
" Details \\\n",
|
||||
"0 NaN \n",
|
||||
"1 NaN \n",
|
||||
"2 \\n \n",
|
||||
"3 Unsure \n",
|
||||
"4 NaN \n",
|
||||
".. ... \n",
|
||||
"181 German model: facebook forced to police conten... \n",
|
||||
"182 NaN \n",
|
||||
"183 NaN \n",
|
||||
"184 Alter and/or block the publication/disseminati... \n",
|
||||
"185 NaN \n",
|
||||
"\n",
|
||||
" Playbook(s) \\\n",
|
||||
"0 In all playbooks the platform must force user ... \n",
|
||||
"1 Social media companies remove inactive account... \n",
|
||||
"2 In all cases some checks need to prevent depla... \n",
|
||||
"3 NaN \n",
|
||||
"4 NaN \n",
|
||||
".. ... \n",
|
||||
"181 NaN \n",
|
||||
"182 NaN \n",
|
||||
"183 NaN \n",
|
||||
"184 NaN \n",
|
||||
"185 Add date and source to images \n",
|
||||
"\n",
|
||||
" Resources needed \\\n",
|
||||
"0 platform_admin,activists,civil_society,money \n",
|
||||
"1 platform_admin,platform_admin:socialmedia,publ... \n",
|
||||
"2 platform_admin,platform_admin:socialmedia \n",
|
||||
"3 NaN \n",
|
||||
"4 NaN \n",
|
||||
".. ... \n",
|
||||
"181 government:policymakers \n",
|
||||
"182 government:policymakers \n",
|
||||
"183 platform_admin \n",
|
||||
"184 platform_admin \n",
|
||||
"185 NaN \n",
|
||||
"\n",
|
||||
" How found References Incidents \\\n",
|
||||
"0 2019-11-workshop NaN NaN \n",
|
||||
"1 2019-11-workshop,2019-11-search NaN I00004 \n",
|
||||
"2 2019-11-workshop NaN NaN \n",
|
||||
"3 2019-11-workshop NaN NaN \n",
|
||||
"4 2019-11-workshop NaN NaN \n",
|
||||
".. ... ... ... \n",
|
||||
"181 2019-11-workshop NaN NaN \n",
|
||||
"182 2019-11-workshop NaN NaN \n",
|
||||
"183 grugq NaN NaN \n",
|
||||
"184 grugq Taylor81 NaN \n",
|
||||
"185 grugq NaN NaN \n",
|
||||
"\n",
|
||||
" Tactic Response \\\n",
|
||||
"0 TA03 Develop People D3 Disrupt \n",
|
||||
"1 TA04 Develop Networks D4 Degrade \n",
|
||||
"2 TA06 Develop Content D2 Deny \n",
|
||||
"3 TA01 Strategic Planning D4 Degrade \n",
|
||||
"4 TA06 Develop Content D3 Disrupt \n",
|
||||
".. ... ... \n",
|
||||
"181 TA07 Channel Selection D3 Disrupt \n",
|
||||
"182 TA07 Channel Selection D3 Disrupt \n",
|
||||
"183 TA07 Channel Selection D2 Deny \n",
|
||||
"184 TA09 Exposure D2 Deny \n",
|
||||
"185 TA06 Develop Content D3 Disrupt \n",
|
||||
"\n",
|
||||
" Techniques NOTES \n",
|
||||
"0 T0011 - Hijack accounts NaN \n",
|
||||
"1 T0011 - Hijack accounts\\nTA06 - Develop Conten... NaN \n",
|
||||
"2 T0022 - Conspiracy narratives\\nT0026 - Create ... NaN \n",
|
||||
"3 T0002 - Facilitate State Propaganda NaN \n",
|
||||
"4 NaN NaN \n",
|
||||
".. ... ... \n",
|
||||
"181 NaN NaN \n",
|
||||
"182 NaN NaN \n",
|
||||
"183 NaN NaN \n",
|
||||
"184 NaN NaN \n",
|
||||
"185 NaN NaN \n",
|
||||
"\n",
|
||||
"[186 rows x 13 columns]"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import generate_amitt_counters\n",
|
||||
"\n",
|
||||
"counter = generate_amitt_counters.Counter()\n",
|
||||
"counter.write_tactics_markdown()\n",
|
||||
"counter.write_metacounts_markdown()\n",
|
||||
"counter.write_resource_markdown()\n",
|
||||
"counter.dfcounters"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_v1.0.png
Normal file
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_v1.0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 908 KiB |
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_v2.0draft.xlsx
Normal file
BIN
DISARM_DOCUMENTATION/DISARM_HISTORY/AMITT_v2.0draft.xlsx
Normal file
Binary file not shown.
282
DISARM_DOCUMENTATION/DISARM_HISTORY/generate_amitt_counters.py
Normal file
282
DISARM_DOCUMENTATION/DISARM_HISTORY/generate_amitt_counters.py
Normal file
|
@ -0,0 +1,282 @@
|
|||
''' Manage AMITT counters
|
||||
|
||||
Create a page for each of the AMITT counter objects.
|
||||
Don't worry about creating notes etc for these - they'll be in the generating spreadsheet
|
||||
|
||||
Reads 1 excel file: ../AMITT_MASTER_DATA/AMITT_Counters_MASTER.xlsx with sheets
|
||||
* AMITT_objects: tactics, responses, actors, techniques
|
||||
* Countermeasures
|
||||
*
|
||||
|
||||
Creates markdown files
|
||||
* ../counter_tactic_counts.md
|
||||
* ../counter_tactics/{}counters.md
|
||||
* ../counter_metatag_counts.md
|
||||
* ../counter_metatag/{1}counters.md
|
||||
* ../counter_resource_counts.md
|
||||
* ../counter_resource/{1}counters.md
|
||||
*
|
||||
* {}/{}counters.md
|
||||
*
|
||||
|
||||
'''
|
||||
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import os
|
||||
from sklearn.feature_extraction.text import CountVectorizer
|
||||
|
||||
|
||||
class Counter:
|
||||
def __init__(self, infile = '../AMITT_MASTER_DATA/AMITT_Counters_MASTER.xlsx'):
|
||||
|
||||
|
||||
# Create counters cross-tables
|
||||
crossidtechs = self.splitcol(self.dfcounters[['ID', 'Techniques']],
|
||||
'Techniques', 'Techs', '\n')
|
||||
crossidtechs = crossidtechs[crossidtechs['Techs'].notnull()]
|
||||
crossidtechs['TID'] = crossidtechs['Techs'].str.split(' ').str[0]
|
||||
crossidtechs.drop('Techs', axis=1, inplace=True)
|
||||
self.idtechnique = crossidtechs
|
||||
|
||||
crossidres = self.splitcol(self.dfcounters[['ID', 'Resources needed']],
|
||||
'Resources needed', 'Res', ',')
|
||||
crossidres = crossidres[crossidres['Res'].notnull()]
|
||||
self.idresource = crossidres
|
||||
|
||||
|
||||
def analyse_counter_text(self, col='Title'):
|
||||
# Analyse text in counter descriptions
|
||||
alltext = (' ').join(self.dfcounters[col].to_list()).lower()
|
||||
count_vect = CountVectorizer(stop_words='english')
|
||||
word_counts = count_vect.fit_transform([alltext])
|
||||
dfw = pd.DataFrame(word_counts.A, columns=count_vect.get_feature_names()).transpose()
|
||||
dfw.columns = ['count']
|
||||
dfw = dfw.sort_values(by='count', ascending=False)
|
||||
return(dfw)
|
||||
|
||||
|
||||
def splitcol(self, df, col, newcol, divider=','):
|
||||
# Thanks https://stackoverflow.com/questions/17116814/pandas-how-do-i-split-text-in-a-column-into-multiple-rows?noredirect=1
|
||||
return (df.join(df[col]
|
||||
.str.split(divider, expand=True).stack()
|
||||
.reset_index(drop=True,level=1)
|
||||
.rename(newcol)).drop(col, axis=1))
|
||||
|
||||
|
||||
# Print list of counters for each square of the COA matrix
|
||||
# Write HTML version of framework diagram to markdown file
|
||||
def write_counters_tactics_markdown(self, outfile = '../counter_tactic_counts.md'):
|
||||
|
||||
coacounts = pd.pivot_table(self.dfcounters[['Tactic', 'Response',
|
||||
'ID']], index='Response', columns='Tactic', aggfunc=len, fill_value=0)
|
||||
|
||||
html = '''# AMITT Courses of Action matrix:
|
||||
|
||||
<table border="1">
|
||||
<tr>
|
||||
<td> </td>
|
||||
'''
|
||||
#Table heading = Tactic names
|
||||
for col in coacounts.columns.get_level_values(1):
|
||||
tid = self.create_tactic_file(col)
|
||||
html += '<td><a href="counter_tactics/{0}counters.md">{1}</a></td>\n'.format(
|
||||
tid, col)
|
||||
html += '</tr><tr>\n'
|
||||
|
||||
# number of counters per response type
|
||||
for response, counts in coacounts.iterrows():
|
||||
html += '<td>{}</td>\n'.format(response)
|
||||
for val in counts.values:
|
||||
html += '<td>{}</td>\n'.format(val)
|
||||
html += '</tr>\n<tr>\n'
|
||||
|
||||
# Total per tactic
|
||||
html += '<td>TOTALS</td>\n'
|
||||
for val in coacounts.sum().values:
|
||||
html += '<td>{}</td>\n'.format(val)
|
||||
html += '</tr>\n</table>\n'
|
||||
|
||||
with open(outfile, 'w') as f:
|
||||
f.write(html)
|
||||
print('updated {}'.format(outfile))
|
||||
return
|
||||
|
||||
def create_tactic_file(self, tname):
|
||||
if not os.path.exists('../counter_tactics'):
|
||||
os.makedirs('../counter_tactics')
|
||||
|
||||
tid = tname[:tname.find(' ')]
|
||||
html = '''# Tactic {} counters\n\n'''.format(tname)
|
||||
|
||||
html += '## by action\n\n'
|
||||
for resp, counters in self.dfcounters[self.dfcounters['Tactic'] == tname].groupby('Response'):
|
||||
html += '\n### {}\n'.format(resp)
|
||||
|
||||
for c in counters.iterrows():
|
||||
html += '* {}: {} (needs {})\n'.format(c[1]['ID'], c[1]['Title'],
|
||||
c[1]['Resources needed'])
|
||||
|
||||
html += '\n## by technique\n\n'
|
||||
tactecs = self.techniques[self.techniques['phase'] == tid]['Id'].to_list()
|
||||
for tech in [tid] + tactecs:
|
||||
if tech == tid:
|
||||
html += '\n### {}\n'.format(tech)
|
||||
else:
|
||||
techname = self.techniques[self.techniques['Id']==tech]['longname']
|
||||
html += '\n### {}\n'.format(techname)
|
||||
|
||||
taccounts = self.idtechnique[self.idtechnique['TID'] == tech]
|
||||
# html += '\n{}\n'.format(taccounts)
|
||||
for c in self.dfcounters[self.dfcounters['ID'].isin(taccounts['ID'])].iterrows():
|
||||
html += '* {}: {} (needs {})\n'.format(c[1]['ID'], c[1]['Title'],
|
||||
c[1]['Resources needed'])
|
||||
|
||||
datafile = '../counter_tactics/{}counters.md'.format(tid)
|
||||
print('Writing {}'.format(datafile))
|
||||
with open(datafile, 'w') as f:
|
||||
f.write(html)
|
||||
f.close()
|
||||
return(tid)
|
||||
|
||||
|
||||
def create_object_file(self, index, rowtype, datadir):
|
||||
|
||||
oid = index
|
||||
html = '''# {} counters: {}\n\n'''.format(rowtype, index)
|
||||
|
||||
html += '## by action\n\n'
|
||||
for resp, clist in self.dfcounters[self.dfcounters[rowtype] == index].groupby('Response'):
|
||||
html += '\n### {}\n'.format(resp)
|
||||
|
||||
for c in clist.iterrows():
|
||||
html += '* {}: {} (needs {})\n'.format(c[1]['ID'], c[1]['Title'],
|
||||
c[1]['Resources needed'])
|
||||
|
||||
datafile = '{}/{}counters.md'.format(datadir, oid)
|
||||
print('Writing {}'.format(datafile))
|
||||
with open(datafile, 'w') as f:
|
||||
f.write(html)
|
||||
f.close()
|
||||
return(oid)
|
||||
|
||||
|
||||
def write_counters_metacounts_markdown(self, outfile = '../counter_metatag_counts.md'):
|
||||
|
||||
coltype = 'Response'
|
||||
rowtype = 'metatechnique'
|
||||
rowname = 'metatag'
|
||||
mtcounts = pd.pivot_table(self.dfcounters[[coltype, rowtype,'ID']],
|
||||
index=rowtype, columns=coltype, aggfunc=len,
|
||||
fill_value=0)
|
||||
mtcounts['TOTALS'] = mtcounts.sum(axis=1)
|
||||
|
||||
html = '''# AMITT {} courses of action
|
||||
|
||||
<table border="1">
|
||||
<tr>
|
||||
<td> </td>
|
||||
'''.format(rowtype)
|
||||
|
||||
# Table heading row
|
||||
for col in mtcounts.columns.get_level_values(1)[:-1]:
|
||||
html += '<td>{}</td>\n'.format(col)
|
||||
html += '<td>TOTALS</td></tr><tr>\n'
|
||||
|
||||
# Data rows
|
||||
datadir = '../counters_{}'.format(rowname)
|
||||
if not os.path.exists(datadir):
|
||||
os.makedirs(datadir)
|
||||
for index, counts in mtcounts.iterrows():
|
||||
tid = self.create_object_file(index, rowtype, datadir)
|
||||
html += '<td><a href="counter_{0}/{1}counters.md">{2}</a></td>\n'.format(
|
||||
rowname, tid, index)
|
||||
for val in counts.values:
|
||||
html += '<td>{}</td>\n'.format(val)
|
||||
html += '</tr>\n<tr>\n'
|
||||
|
||||
# Column sums
|
||||
html += '<td>TOTALS</td>\n'
|
||||
for val in mtcounts.sum().values:
|
||||
html += '<td>{}</td>\n'.format(val)
|
||||
html += '</tr>\n</table>\n'
|
||||
|
||||
with open(outfile, 'w') as f:
|
||||
f.write(html)
|
||||
print('updated {}'.format(outfile))
|
||||
|
||||
return
|
||||
|
||||
|
||||
def create_resource_file(self, index, rowtype, datadir):
|
||||
oid = index
|
||||
counterrows = self.idresource[self.idresource['Res'] == index]['ID'].to_list()
|
||||
html = '''# {} counters: {}\n\n'''.format(rowtype, index)
|
||||
html += '## by action\n\n'
|
||||
omatrix = self.dfcounters[self.dfcounters['ID'].isin(counterrows)].groupby('Response')
|
||||
for resp, clist in omatrix:
|
||||
html += '\n### {}\n'.format(resp)
|
||||
for c in clist.iterrows():
|
||||
html += '* {}: {} (needs {})\n'.format(c[1]['ID'], c[1]['Title'],
|
||||
c[1]['Resources needed'])
|
||||
|
||||
datafile = '{}/{}counters.md'.format(datadir, oid)
|
||||
print('Writing {}'.format(datafile))
|
||||
with open(datafile, 'w') as f:
|
||||
f.write(html)
|
||||
f.close()
|
||||
return(oid, omatrix)
|
||||
|
||||
|
||||
def write_counters_resource_markdown(self, outfile = '../counter_resource_counts.md'):
|
||||
|
||||
coltype = 'Response'
|
||||
rowtype = 'resource'
|
||||
rowname = 'resource'
|
||||
|
||||
html = '''# AMITT {} courses of action
|
||||
|
||||
<table border="1">
|
||||
<tr>
|
||||
<td> </td>
|
||||
'''.format(rowtype)
|
||||
|
||||
# Table heading row
|
||||
colvals = self.dfcounters[coltype].value_counts().sort_index().index
|
||||
for col in colvals:
|
||||
html += '<td>{}</td>\n'.format(col)
|
||||
html += '<td>TOTALS</td></tr><tr>\n'
|
||||
|
||||
# Data rows
|
||||
datadir = '../counter_{}'.format(rowname)
|
||||
if not os.path.exists(datadir):
|
||||
os.makedirs(datadir)
|
||||
for index in self.idresource['Res'].value_counts().sort_index().index:
|
||||
(oid, omatrix) = self.create_resource_file(index, rowtype, datadir) #self
|
||||
row = pd.DataFrame(omatrix.apply(len), index=colvals).fillna(' ')
|
||||
html += '<td><a href="counter_{0}/{1}counters.md">{2}</a></td>\n'.format(
|
||||
rowname, oid, index)
|
||||
if len(row.columns) > 0:
|
||||
for val in row[0].to_list():
|
||||
html += '<td>{}</td>\n'.format(val)
|
||||
html += '<td>{}</td></tr>\n<tr>\n'.format('')
|
||||
|
||||
html += '</tr>\n</table>\n'
|
||||
|
||||
with open(outfile, 'w') as f:
|
||||
f.write(html)
|
||||
print('updated {}'.format(outfile))
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
counter = Counter()
|
||||
counter.write_counters_tactics_markdown()
|
||||
counter.write_counters_metacounts_markdown()
|
||||
counter.write_counters_resource_markdown()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
19
DISARM_DOCUMENTATION/README.md
Normal file
19
DISARM_DOCUMENTATION/README.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
# AMITT Design Guides
|
||||
|
||||
## README: About the AMITT Guides
|
||||
|
||||
These are introductions to the AMITT family of disinformation models: STIX, TTPs, and Countermeasures. It covers their origins, their contents, and their uses.
|
||||
|
||||
|
||||
## Guides
|
||||
|
||||
* [AMITT Design Guide](00_AMITT_Design_Guide_version1.pdf) - design and philosophy behind AMITT frameworks
|
||||
* [AMITT User Guide](05_AMITT_User_Guide.pdf) - ways to work with AMITT frameworks
|
||||
* [AMITT TTP Guide](01_AMITT_TTP_Guide.pdf) - describes each of the AMITT and counter TTPs
|
||||
* [Proposed changes to AMITT](02_Proposed_Changes_to_AMITT.pdf)
|
||||
* [AMITT Use Cases](03_AMITT_Use_Cases.pdf) - examples
|
||||
* [AMITT Incident List](04_AMITT_Incident_List.pdf) - the incident descriptions we used to create AMITT
|
||||
|
||||
The guides are being worked on - these PDFs will be updated periodically. For latest edits, see the [working copies of the guides](https://drive.google.com/drive/u/0/folders/1SVOp-D6ukSfqQSBTZCXfBSQPT0FAWFkH).
|
||||
|
||||
Copyright CC-BY-SA, CogSecCollab and CTI League Disinformation Team
|
Loading…
Add table
Add a link
Reference in a new issue