1 00:00:00,090 --> 00:00:13,750 33C3 preroll music 2 00:00:13,750 --> 00:00:16,299 basically textbooks have been written 3 00:00:16,299 --> 00:00:19,718 about it countless talks have been 4 00:00:19,718 --> 00:00:22,480 have been Illuminating all of the errors 5 00:00:22,480 --> 00:00:26,690 of our ways and still all those sucky 6 00:00:26,690 --> 00:00:30,400 software is out there but 7 00:00:30,400 --> 00:00:33,130 Fefe over here the hero of our show 8 00:00:33,130 --> 00:00:36,700 has put out has put all of these best 9 00:00:36,700 --> 00:00:39,990 practices into you know into his work to 10 00:00:39,990 --> 00:00:43,480 try to create a secure website he's 11 00:00:43,480 --> 00:00:46,859 going to show us how it's done so that 12 00:00:46,859 --> 00:00:52,489 we can all sleep way better at night and 13 00:00:52,489 --> 00:00:55,189 with that template go back and 14 00:00:55,189 --> 00:00:57,303 and secure our own software and so with 15 00:00:57,303 --> 00:00:59,540 that I'm going to hand it right over to 16 00:00:59,540 --> 00:01:01,930 Fefe give him a round of applause 17 00:01:01,930 --> 00:01:12,406 applause 18 00:01:13,371 --> 00:01:15,153 thank you I have to start 19 00:01:15,153 --> 00:01:17,580 with an apology because I did submit 20 00:01:17,580 --> 00:01:19,840 this talk but it was rejected so the 21 00:01:19,840 --> 00:01:21,880 slides are not at the stage where they 22 00:01:21,880 --> 00:01:24,320 should be these are our slides for a 23 00:01:24,320 --> 00:01:26,359 previous version of the talk it contains 24 00:01:26,359 --> 00:01:28,179 all the material and I tried to update 25 00:01:28,179 --> 00:01:30,231 it more but that destroyed the flow so 26 00:01:30,231 --> 00:01:33,334 we we're stuck with it basically the 27 00:01:33,084 --> 00:01:35,720 difference was the the audience so while 28 00:01:35,720 --> 00:01:37,580 I expect more developers here the other 29 00:01:37,580 --> 00:01:39,259 audience was more and hackers and 30 00:01:39,259 --> 00:01:42,640 business people so I try to get them 31 00:01:42,640 --> 00:01:45,800 from where they are and the main question 32 00:01:45,800 --> 00:01:48,382 usually is "are we there yet?" right 33 00:01:48,382 --> 00:01:50,842 so about me you probably 34 00:01:50,842 --> 00:01:52,960 seen this before I'm a code auditor by 35 00:01:52,960 --> 00:01:55,479 trade I have a small company and 36 00:01:55,229 --> 00:01:57,230 companies show us their code and I show 37 00:01:57,230 --> 00:02:00,190 them bugs I find in them quite easy 38 00:02:01,911 --> 00:02:04,000 but before we start I have a small 39 00:02:04,000 --> 00:02:06,500 celebration to do this actually happened 40 00:02:06,500 --> 00:02:09,230 just a day before the first time I 41 00:02:09,230 --> 00:02:11,680 talked about this so Kaspersky 42 00:02:11,680 --> 00:02:15,440 message they found some malware introduced 43 00:02:15,440 --> 00:02:16,540 tied to libc 44 00:02:16,540 --> 00:02:18,340 which I have written so this is 45 00:02:18,340 --> 00:02:19,270 like a 46 00:02:19,270 --> 00:02:26,430 applause 47 00:02:27,257 --> 00:02:28,999 some of the malware people 48 00:02:28,999 --> 00:02:31,020 know what's good 49 00:02:31,020 --> 00:02:33,430 so basically the main question when I 50 00:02:33,430 --> 00:02:35,769 talk to customers is we spend so much 51 00:02:35,769 --> 00:02:38,860 money on this why isn't it working 52 00:02:38,860 --> 00:02:42,399 and the answer is you're doing it wrong 53 00:02:42,399 --> 00:02:46,420 so I will try to show now what exactly is wrong 54 00:02:46,420 --> 00:02:49,830 and there's a small preface here people 55 00:02:49,830 --> 00:02:51,730 usually say there's no time to do this 56 00:02:51,730 --> 00:02:54,230 right and that's just wrong you have 57 00:02:54,230 --> 00:02:56,580 exactly as much time per day as other 58 00:02:56,580 --> 00:02:58,640 people who did great things so you can 59 00:02:58,640 --> 00:03:01,780 do great things too you just need to do it 60 00:03:02,620 --> 00:03:05,420 so let's play a little warm-up game 61 00:03:05,420 --> 00:03:07,050 it's called how it started and how 62 00:03:07,050 --> 00:03:09,570 it's going so let's have a demo round 63 00:03:09,570 --> 00:03:11,420 IBM Watson is revolutionizing 64 00:03:11,420 --> 00:03:14,839 10 Industries and it's going like this 65 00:03:14,839 --> 00:03:17,219 whatever happened to IBM Watson that's a 66 00:03:17,219 --> 00:03:19,629 typical pattern in the security industry 67 00:03:19,629 --> 00:03:23,150 right so here's another one how it started 68 00:03:23,150 --> 00:03:25,480 revolutionize security with AI 69 00:03:25,480 --> 00:03:27,261 right we all know where this is going 70 00:03:27,261 --> 00:03:28,461 laugther 71 00:03:28,461 --> 00:03:31,230 right so that's the pattern 72 00:03:31,230 --> 00:03:33,640 let's play IT security mine sweeper 73 00:03:33,390 --> 00:03:35,256 right so everybody here probably 74 00:03:35,256 --> 00:03:37,349 knows who Gartner is they publish 75 00:03:37,349 --> 00:03:39,379 recommendations and they even have a 76 00:03:39,379 --> 00:03:41,249 voting section where people can say 77 00:03:41,249 --> 00:03:43,159 this is the best product in this section 78 00:03:42,909 --> 00:03:45,248 right so let's look at a few of them and 79 00:03:45,248 --> 00:03:48,040 see what happened to people who trusted Gartner 80 00:03:48,040 --> 00:03:51,020 first is a firewall right so how 81 00:03:51,020 --> 00:03:54,247 it started the number one recommendation 82 00:03:54,247 --> 00:03:57,175 is for Fortinet and they have a lot of 83 00:03:57,175 --> 00:03:59,425 marketing gibberish 84 00:03:59,425 --> 00:04:01,229 laughter 85 00:04:01,229 --> 00:04:03,159 and if you look how it's going it's not 86 00:04:03,159 --> 00:04:05,300 going so good 87 00:04:05,850 --> 00:04:08,090 so let's extend the pattern a bit 88 00:04:08,090 --> 00:04:10,420 why what happened to me in this regard 89 00:04:10,420 --> 00:04:11,750 so I don't need a firewall 90 00:04:11,750 --> 00:04:14,270 I don't have any ports open that I need blocking right 91 00:04:14,270 --> 00:04:16,120 so you don't need this 92 00:04:16,120 --> 00:04:18,559 strictly speaking you don't need it 93 00:04:18,559 --> 00:04:20,479 next discipline endpoint protection 94 00:04:20,479 --> 00:04:24,519 so it started with Trellix this is the 95 00:04:24,519 --> 00:04:26,773 number one recommendation on Gartner 96 00:04:26,773 --> 00:04:28,769 I hadn't heard of them there like can make 97 00:04:28,769 --> 00:04:30,429 a feed joint venture or something 98 00:04:30,429 --> 00:04:31,434 who cares 99 00:04:31,434 --> 00:04:34,543 they also have great marketing gibberish 100 00:04:34,543 --> 00:04:36,304 and then if you look at what happened 101 00:04:36,304 --> 00:04:39,214 it's like they made it worse 102 00:04:39,214 --> 00:04:42,955 okay so this didn't apply to me 103 00:04:42,955 --> 00:04:45,305 either because I don't use snake oil 104 00:04:45,305 --> 00:04:47,295 let's see the third one password manager 105 00:04:47,295 --> 00:04:48,530 also very popular 106 00:04:49,730 --> 00:04:52,320 how it started recommended LastPass 107 00:04:52,320 --> 00:04:54,250 you probably know where this is going 108 00:04:54,250 --> 00:04:55,747 laugther 109 00:04:57,129 --> 00:04:59,710 yeah they got owned and then 110 00:04:59,710 --> 00:05:00,892 people got owned 111 00:05:02,502 --> 00:05:05,241 so you may notice a pattern here 112 00:05:05,436 --> 00:05:06,916 this didn't apply to me because 113 00:05:06,916 --> 00:05:08,916 I deserve a password authentication use 114 00:05:08,916 --> 00:05:10,810 public key which has been available for 115 00:05:10,810 --> 00:05:14,150 decades right so small bonus 116 00:05:14,150 --> 00:05:17,109 the last one 2FA 117 00:05:17,609 --> 00:05:19,789 Gartner recommends Duo which has 118 00:05:19,789 --> 00:05:22,039 been bought by Cisco but doesn't matter 119 00:05:23,589 --> 00:05:25,414 so if you look at what Duo does 120 00:05:25,414 --> 00:05:27,378 your server asks the cloud for 121 00:05:27,378 --> 00:05:29,877 permission the cloud goes to the telephone 122 00:05:29,877 --> 00:05:33,590 telephone shows a popup you click yes 123 00:05:31,590 --> 00:05:35,100 and then the cloud tells the server it's 124 00:05:35,100 --> 00:05:37,470 okay you can let them in if you look 125 00:05:37,470 --> 00:05:39,360 really closely you can notice the cloud 126 00:05:39,360 --> 00:05:41,520 doesn't have to do the popup it can just 127 00:05:41,520 --> 00:05:43,871 say sure so this comes pre-owned 128 00:05:43,871 --> 00:05:45,952 there is no need to hack anything here 129 00:05:45,952 --> 00:05:47,452 laugther 130 00:05:47,452 --> 00:05:48,980 and something many people don't 131 00:05:48,980 --> 00:05:50,596 realize you don't need two factor 132 00:05:50,596 --> 00:05:53,410 if you have public key that's already the second factor 133 00:05:53,944 --> 00:05:55,109 Okay, so 134 00:05:55,789 --> 00:05:57,808 yeah let's skip over this briefly 135 00:05:57,808 --> 00:06:00,318 Splunk is the the recommend option here 136 00:06:00,318 --> 00:06:02,038 and they make the organization 137 00:06:02,038 --> 00:06:04,438 more resilient unless you install it 138 00:06:04,438 --> 00:06:07,279 laughter 139 00:06:07,279 --> 00:06:15,543 applause 140 00:06:15,543 --> 00:06:17,812 okay so this one is dear to my heart 141 00:06:17,812 --> 00:06:20,713 because people start arguing about 142 00:06:20,713 --> 00:06:22,453 whether to install patches and 143 00:06:22,453 --> 00:06:25,093 which patch to install first and it used 144 00:06:25,093 --> 00:06:27,683 to be simple you look for problems 145 00:06:27,683 --> 00:06:29,443 then you install the patches and then 146 00:06:29,443 --> 00:06:31,533 it got a bit more complicated and 147 00:06:31,533 --> 00:06:33,423 the result is this right 148 00:06:33,423 --> 00:06:36,173 that's a famous podcast in Germany 149 00:06:36,173 --> 00:06:38,693 it's about municipality who got owned 150 00:06:38,693 --> 00:06:41,673 by ransomware and then had to call the 151 00:06:41,673 --> 00:06:42,943 army for help 152 00:06:42,943 --> 00:06:44,460 inaudible chatter in crowd 153 00:06:44,460 --> 00:06:46,510 and what you should do I'm having 154 00:06:46,510 --> 00:06:48,470 this for completeness install all patches 155 00:06:48,470 --> 00:06:50,430 immediately but that's a separate talk 156 00:06:50,430 --> 00:06:52,705 right so you may notice a pattern here 157 00:06:52,705 --> 00:06:54,450 the IT security industry 158 00:06:54,450 --> 00:06:55,630 recommends something and 159 00:06:55,630 --> 00:06:58,274 if you do it you're [ __ ] so don't do it 160 00:06:58,274 --> 00:07:01,000 in case you can't read this says snake 161 00:07:01,000 --> 00:07:03,460 repellent granules and then there's a 162 00:07:03,460 --> 00:07:05,060 snake sleeping next to it 163 00:07:05,060 --> 00:07:06,111 laugther 164 00:07:06,111 --> 00:07:07,390 coughing 165 00:07:07,921 --> 00:07:10,670 right so if we can't trust the 166 00:07:10,670 --> 00:07:12,911 recommendations of the industry what shall we do 167 00:07:13,449 --> 00:07:15,049 and so I had a lot of 168 00:07:15,049 --> 00:07:16,929 time on my hands because I didn't have 169 00:07:16,929 --> 00:07:19,510 to clean up after crappy IT security 170 00:07:19,510 --> 00:07:21,570 industry recommendations so what 171 00:07:21,570 --> 00:07:23,770 what did I do with my time 172 00:07:24,210 --> 00:07:26,630 and I decided I need a Blog 173 00:07:26,630 --> 00:07:30,440 some time ago now and I started 174 00:07:30,440 --> 00:07:32,660 thinking what do I need and it's 175 00:07:32,660 --> 00:07:34,570 actually not that much I could have just 176 00:07:34,570 --> 00:07:37,590 shown basically static content a little 177 00:07:37,590 --> 00:07:39,727 search function would be good but it's 178 00:07:39,727 --> 00:07:42,530 optional um I didn't need comments for 179 00:07:42,530 --> 00:07:44,920 legal reasons because people start 180 00:07:44,920 --> 00:07:48,390 posting like links to maware or 181 00:07:48,390 --> 00:07:50,230 whatever I don't want that I don't 182 00:07:50,230 --> 00:07:52,162 need that right so the first version was 183 00:07:52,162 --> 00:07:53,950 actually really easy it was a small 184 00:07:53,950 --> 00:07:56,141 standard web server and I had the 185 00:07:56,141 --> 00:07:58,219 blog entries a static HTML files 186 00:07:58,219 --> 00:08:00,199 one file per month it was actually really 187 00:08:00,199 --> 00:08:02,090 easy if you want to search you just can 188 00:08:02,090 --> 00:08:04,870 ask Google and limit it to my site so 189 00:08:04,870 --> 00:08:07,229 posting was also easy had a little 190 00:08:07,229 --> 00:08:09,699 script that I could run on the server 191 00:08:09,699 --> 00:08:12,924 and I just SSH in and SSH I trust for 192 00:08:12,924 --> 00:08:14,824 authentication so there's no new attack 193 00:08:14,824 --> 00:08:17,445 surface I have that anyway and this is a 194 00:08:17,445 --> 00:08:20,074 great design it's secure it's simple 195 00:08:20,074 --> 00:08:22,190 there's low risk it's also high 196 00:08:22,190 --> 00:08:24,779 performance but you couldn't do a talk 197 00:08:24,779 --> 00:08:27,270 about it at the CCC right so 198 00:08:27,270 --> 00:08:30,130 it's too boring so I started to introduce 199 00:08:30,130 --> 00:08:31,200 risk in my setup 200 00:08:31,200 --> 00:08:33,640 *laughter 201 00:08:34,400 --> 00:08:36,410 so the first idea was I had 202 00:08:36,410 --> 00:08:38,280 written a small web server I could just 203 00:08:38,280 --> 00:08:40,360 implement the blog in the web server 204 00:08:40,360 --> 00:08:43,384 because you know it's my code anyway 205 00:08:43,384 --> 00:08:46,796 but that has downsides if the the blog 206 00:08:46,796 --> 00:08:48,935 is running in the web server then it can 207 00:08:48,935 --> 00:08:50,846 access all the memory of the web server 208 00:08:50,846 --> 00:08:52,776 in particular it can see the TLS private 209 00:08:52,776 --> 00:08:55,166 key and that I don't want people to 210 00:08:55,166 --> 00:08:57,856 extract right so it can't be a module 211 00:08:57,856 --> 00:09:00,056 in the web server 212 00:09:00,480 --> 00:09:03,030 and the the obvious solution is 213 00:09:03,030 --> 00:09:05,510 it has to run in a different user ID on 214 00:09:05,510 --> 00:09:08,090 on Linux I'm using Linux or but any 215 00:09:08,090 --> 00:09:09,810 Unix or Windows would be the same 216 00:09:09,810 --> 00:09:11,860 basically it runs in a different user ID 217 00:09:11,860 --> 00:09:13,940 and then if you if you take over the 218 00:09:13,940 --> 00:09:15,989 process of the blog because there's some 219 00:09:15,989 --> 00:09:18,680 bug in it you couldn't access the TLS 220 00:09:18,680 --> 00:09:21,770 key and while I did that the industry 221 00:09:21,770 --> 00:09:23,049 was doing this 222 00:09:23,049 --> 00:09:23,759 chatter 223 00:09:23,759 --> 00:09:25,429 that's like the running gag of this 224 00:09:25,429 --> 00:09:27,520 talk I show all kinds of interesting 225 00:09:27,520 --> 00:09:29,280 things the industry did and then show 226 00:09:29,280 --> 00:09:31,209 what I did in that time right so 227 00:09:31,939 --> 00:09:32,828 next question 228 00:09:32,828 --> 00:09:34,749 where's the content I could just have 229 00:09:34,749 --> 00:09:37,418 files on disk like static HTML as before 230 00:09:37,418 --> 00:09:39,819 but I think that's not professional enough 231 00:09:39,569 --> 00:09:41,829 right so for a good CCC talk you 232 00:09:41,829 --> 00:09:44,059 need to be more professional 233 00:09:44,059 --> 00:09:45,260 also for a different 234 00:09:45,260 --> 00:09:47,488 project I had just written an LDAP server 235 00:09:47,488 --> 00:09:50,543 so I decided to reuse it and 236 00:09:50,543 --> 00:09:52,400 while I did that the industry did this 237 00:09:52,400 --> 00:09:54,080 I took this photo at the airport of 238 00:09:53,830 --> 00:09:55,731 Jerusalem so this is an actual ad it's 239 00:09:55,731 --> 00:09:57,210 not photoshopped right it's for 240 00:09:57,210 --> 00:09:59,040 Northrop Grumman which is a 241 00:09:59,040 --> 00:10:02,760 military contractor and it's about full 242 00:10:02,760 --> 00:10:05,700 spectrum cyber across all domains 243 00:10:05,700 --> 00:10:06,933 chatter 244 00:10:06,933 --> 00:10:09,770 so why would I write my own LDAP server 245 00:10:09,770 --> 00:10:11,870 mostly because it's small and 246 00:10:11,870 --> 00:10:14,650 because I'm an auditor by trade I know 247 00:10:14,650 --> 00:10:17,630 that if you want a chance to actually 248 00:10:17,630 --> 00:10:19,570 audit the code it needs to be small 249 00:10:19,570 --> 00:10:22,039 because that's a limited resource 250 00:10:22,039 --> 00:10:24,110 the time you can spend on auditing code 251 00:10:24,110 --> 00:10:27,419 right so Postgres is a common SQL 252 00:10:27,419 --> 00:10:30,122 database slapped in the the open LDAP 253 00:10:30,122 --> 00:10:32,621 implementation of the server and tinyldap 254 00:10:32,621 --> 00:10:35,112 is mine and you see it's much slower 255 00:10:35,112 --> 00:10:36,630 and much smaller 256 00:10:38,750 --> 00:10:40,609 yeah so there was more to this 257 00:10:40,609 --> 00:10:43,760 ad campaign I collected a few funny images 258 00:10:45,080 --> 00:10:48,959 right so um if someone manages to 259 00:10:48,709 --> 00:10:52,069 hack the blog CGI or whatever module 260 00:10:52,069 --> 00:10:54,779 I use to to have connect the blog to the 261 00:10:54,779 --> 00:10:57,399 web server they can open any file that 262 00:10:57,399 --> 00:11:00,280 the blog can read right the UID can read 263 00:11:00,280 --> 00:11:02,820 so I should probably do something 264 00:11:02,820 --> 00:11:05,510 about that that was the next step and 265 00:11:05,510 --> 00:11:07,690 the industry was starting to think about 266 00:11:07,690 --> 00:11:09,180 vulnerability management 267 00:11:11,070 --> 00:11:13,360 so there is a mechanism on Unix 268 00:11:13,360 --> 00:11:15,450 on Linux I did a separate talk about that 269 00:11:15,450 --> 00:11:16,630 on the last Congress 270 00:11:16,630 --> 00:11:19,132 it's called seccomp and seccomp it's like 271 00:11:19,132 --> 00:11:21,371 a firewall for sys calls so I can use 272 00:11:21,371 --> 00:11:24,372 seccomp to block open the open sys which 273 00:11:24,372 --> 00:11:26,812 is used to open files but if I have 274 00:11:26,812 --> 00:11:29,092 to use open myself 275 00:11:29,092 --> 00:11:31,722 then I can't block it right so what 276 00:11:31,722 --> 00:11:33,452 to do about that for example my blog 277 00:11:33,452 --> 00:11:35,672 calls local time which converts Unix's 278 00:11:35,672 --> 00:11:38,092 time into the local time zone and for 279 00:11:38,092 --> 00:11:40,372 that it opens a file containing the 280 00:11:40,372 --> 00:11:43,826 description of the system time zone 281 00:11:43,826 --> 00:11:46,646 and that calls open right so if 282 00:11:46,646 --> 00:11:49,332 I just disabled the open system call from 283 00:11:49,332 --> 00:11:51,057 my blog then it couldn't do the time 284 00:11:51,057 --> 00:11:54,356 translation and this is actually 285 00:11:54,356 --> 00:11:57,506 an old problem that also applies to set 286 00:11:57,506 --> 00:12:00,108 ID programs and has has applied to them 287 00:12:00,108 --> 00:12:03,027 for decades so what you can do is you 288 00:12:03,027 --> 00:12:05,818 can reorganize your code so before you 289 00:12:05,818 --> 00:12:08,478 block or before you drop privileges 290 00:12:08,478 --> 00:12:11,356 generally speaking you do the open 291 00:12:11,356 --> 00:12:14,158 calls in this in this example and 292 00:12:14,158 --> 00:12:16,597 then you disable open and then you look 293 00:12:16,597 --> 00:12:18,970 at the the data provided by the attacker 294 00:12:18,970 --> 00:12:21,079 because if the attacker or any untrusted 295 00:12:21,079 --> 00:12:23,590 source is trying to hack you it is via 296 00:12:23,590 --> 00:12:25,704 data it gives you right it's 297 00:12:25,704 --> 00:12:27,884 the environment is compromised so you look 298 00:12:27,884 --> 00:12:29,844 at what kind of uh elements in the 299 00:12:29,844 --> 00:12:31,764 environment are attacker supplied and 300 00:12:31,764 --> 00:12:33,804 before you look at a single byte in them 301 00:12:33,804 --> 00:12:35,924 you do all the dangerous stuff if you can 302 00:12:35,924 --> 00:12:38,203 right so in this case I call local 303 00:12:38,203 --> 00:12:42,213 time once before I drop the open sys call 304 00:12:42,213 --> 00:12:44,904 and then my libc will cache the 305 00:12:44,904 --> 00:12:47,938 time zone data and the next time I call it 306 00:12:47,938 --> 00:12:49,868 after I have looked at the attacker 307 00:12:49,868 --> 00:12:51,877 supplied code there is no need to call 308 00:12:51,877 --> 00:12:53,988 open right so that's a major advantage 309 00:12:53,988 --> 00:12:57,488 of Secom over similar Technologies like 310 00:12:57,488 --> 00:13:03,200 SELinux where all the prohibitions 311 00:13:03,200 --> 00:13:04,450 on sys calls are 312 00:13:04,450 --> 00:13:06,850 applied to the whole process so there is 313 00:13:06,850 --> 00:13:08,656 this is an example and you should make 314 00:13:08,656 --> 00:13:10,249 use of it you should look at your 315 00:13:10,249 --> 00:13:12,120 process and you can see if you have the 316 00:13:12,120 --> 00:13:13,944 source code at least you can see which 317 00:13:13,944 --> 00:13:16,249 parts do I need to do before I can drop 318 00:13:16,249 --> 00:13:18,689 privileges and you move them up right so 319 00:13:18,689 --> 00:13:19,849 that's what I did 320 00:13:22,120 --> 00:13:24,669 this is actually a mockup from 321 00:13:24,669 --> 00:13:27,450 the Estonian cyber security center 322 00:13:28,760 --> 00:13:29,962 so this is real 323 00:13:30,952 --> 00:13:31,952 okay so 324 00:13:31,952 --> 00:13:34,959 next thought so let's 325 00:13:34,959 --> 00:13:38,129 say someone hacks the blog module and 326 00:13:38,129 --> 00:13:40,400 someone else uses the same module but 327 00:13:40,400 --> 00:13:43,141 supplies a password right 328 00:13:43,141 --> 00:13:44,955 this is a common problem in website 329 00:13:44,955 --> 00:13:46,845 in websites there's some kind of login 330 00:13:46,845 --> 00:13:48,704 something you get maybe a session token 331 00:13:48,704 --> 00:13:51,514 or whatever and if someone manages to 332 00:13:51,514 --> 00:13:54,024 take over the middleware 333 00:13:54,024 --> 00:13:55,574 or like the server component 334 00:13:55,584 --> 00:13:58,891 they can see all other connections too 335 00:13:58,891 --> 00:14:00,420 if they are handled by the same 336 00:14:00,420 --> 00:14:03,460 process right that's a major problem 337 00:14:03,460 --> 00:14:06,340 and you can do something about it 338 00:14:06,340 --> 00:14:08,312 so that's the good news here 339 00:14:09,682 --> 00:14:13,019 and in my example it led to me using CGI 340 00:14:13,019 --> 00:14:15,599 instead of fast CGI which is fast CGI 341 00:14:15,599 --> 00:14:17,953 is a newer version of CGI 342 00:14:17,953 --> 00:14:20,910 and the idea with fast CGI is that you 343 00:14:20,910 --> 00:14:24,189 don't spawn a new process for every 344 00:14:24,189 --> 00:14:26,877 request but you have like a Unix domain 345 00:14:26,877 --> 00:14:29,890 socket or another socket to a fast CGI 346 00:14:29,890 --> 00:14:32,180 process and that opens maybe a threat 347 00:14:32,180 --> 00:14:35,550 per request or something but usually 348 00:14:35,550 --> 00:14:37,450 in fast CGI you try to handle the 349 00:14:37,450 --> 00:14:39,440 requests in the same process and then 350 00:14:39,440 --> 00:14:41,590 you can use that process to cach data so 351 00:14:41,590 --> 00:14:45,140 there's a perf advantage to using fast CGI 352 00:14:45,140 --> 00:14:47,300 but for security reasons I don't 353 00:14:47,300 --> 00:14:50,220 I don't use fast CGI so I can't do 354 00:14:50,220 --> 00:14:52,700 caching right so that's a major downside 355 00:14:52,700 --> 00:14:54,450 and you would expect the block to be 356 00:14:54,450 --> 00:14:56,790 really really slow in the end so 357 00:14:56,790 --> 00:14:59,139 first thing I need to use CGI instead of 358 00:14:59,139 --> 00:15:01,949 fast CGI and secondly you could still 359 00:15:01,949 --> 00:15:05,159 use debug APIs so if you use GDB or 360 00:15:05,159 --> 00:15:07,700 another debugger to to look at another 361 00:15:07,700 --> 00:15:10,199 process they use an API called ptrace 362 00:15:10,199 --> 00:15:12,860 but that's a sys call so I can use seccomp 363 00:15:12,860 --> 00:15:16,394 to disallow ptrace if I do those two 364 00:15:16,394 --> 00:15:20,299 and the attacker takes over a blog process 365 00:15:20,299 --> 00:15:22,529 all they can see is the data they supply 366 00:15:22,529 --> 00:15:26,840 themselves right that's a major advantage 367 00:15:27,879 --> 00:15:30,079 Okay so ENISA is actually an EU agency 368 00:15:30,079 --> 00:15:31,569 which I find really disturbing 369 00:15:31,569 --> 00:15:33,480 because they're burning lots of taxpayer 370 00:15:33,480 --> 00:15:38,302 money anyway so let's assume the attacker 371 00:15:38,302 --> 00:15:41,013 can hack my blog they can sill circumvent 372 00:15:41,013 --> 00:15:43,333 any access control I do in the blog 373 00:15:43,333 --> 00:15:46,302 so for example if I have an admin site 374 00:15:46,302 --> 00:15:49,453 or some login site part of the webiste 375 00:15:49,453 --> 00:15:52,128 and it's handled through the same program 376 00:15:52,128 --> 00:15:55,069 and the access control is done in the blog 377 00:15:55,069 --> 00:15:56,939 CGI and someone manages 378 00:15:56,939 --> 00:15:59,190 to hack my blog CGI they could 379 00:15:59,190 --> 00:16:03,280 just skip that so it's really hard 380 00:16:03,280 --> 00:16:05,640 to do access restrictions that can be 381 00:16:05,640 --> 00:16:07,817 circumvented if you do them in your own 382 00:16:07,817 --> 00:16:09,972 code so the solution is not do it in 383 00:16:09,972 --> 00:16:13,421 your own code I don't do any access 384 00:16:13,421 --> 00:16:15,702 restriction in the blog I do it in the 385 00:16:15,702 --> 00:16:18,431 LDAP server so if you connect to my blog 386 00:16:18,431 --> 00:16:20,525 and supply a password then the blog 387 00:16:20,525 --> 00:16:22,000 doesn't know if the password is 388 00:16:22,000 --> 00:16:24,400 right or not there's an for example 389 00:16:24,400 --> 00:16:26,216 there's an interface where you can add 390 00:16:26,216 --> 00:16:28,130 new block entries or you can edit an old 391 00:16:28,130 --> 00:16:29,739 one and for you need to supply 392 00:16:29,739 --> 00:16:31,740 credentials but the block CGI doesn't know 393 00:16:31,740 --> 00:16:33,404 if they are right or not it opens 394 00:16:33,404 --> 00:16:35,264 the connections to the LDAP server with 395 00:16:35,264 --> 00:16:37,344 that credential and then the LDAP server 396 00:16:37,344 --> 00:16:40,853 says yes or no so since we removed 397 00:16:40,853 --> 00:16:44,434 access to the ptraces calls and the 398 00:16:44,434 --> 00:16:46,613 processes are isolated from each other 399 00:16:46,613 --> 00:16:48,234 that means there is nothing to 400 00:16:48,234 --> 00:16:50,394 circumvent here so if someone hacks my 401 00:16:50,394 --> 00:16:52,733 blog the only advantage they get is 402 00:16:52,733 --> 00:16:54,769 they can do the exact same stuff they 403 00:16:54,769 --> 00:16:56,628 could do before basically they can just 404 00:16:56,628 --> 00:16:58,038 talk to the LDAP server 405 00:16:59,628 --> 00:17:01,229 okay so I'm starting to get into 406 00:17:01,229 --> 00:17:04,243 James Bond territory here right 407 00:17:04,243 --> 00:17:05,874 with the attacks they getting more 408 00:17:05,874 --> 00:17:08,884 convoluted right so the industry started 409 00:17:08,884 --> 00:17:10,653 doing threat intelligence feeds which 410 00:17:10,653 --> 00:17:12,634 are useless don't spend money on those 411 00:17:13,100 --> 00:17:15,820 okay so let's say the attacker hacked my 412 00:17:15,820 --> 00:17:19,070 blog and then went to my tinyldap and now 413 00:17:19,070 --> 00:17:21,820 is attacking tinyldap then they can 414 00:17:21,820 --> 00:17:24,060 watch other logins because tinyldap 415 00:17:24,060 --> 00:17:26,552 handles connections from other instances 416 00:17:26,552 --> 00:17:28,970 of the blog too right so the same 417 00:17:28,970 --> 00:17:30,840 problem we had before we just moved the 418 00:17:30,840 --> 00:17:33,119 goal post a little and we need to 419 00:17:33,119 --> 00:17:36,029 prevent this and the obvious solution 420 00:17:36,029 --> 00:17:38,118 is to do the same thing we did 421 00:17:38,118 --> 00:17:41,369 with the blog we have one process of 422 00:17:41,369 --> 00:17:44,794 the LDAP server per request and then we 423 00:17:44,794 --> 00:17:48,793 just allow ptrace right so now you 424 00:17:48,793 --> 00:17:51,349 can't watch even if you get code execution 425 00:17:51,349 --> 00:17:53,590 inside the LDAP server you can't watch 426 00:17:53,590 --> 00:17:55,520 what passwords other people use 427 00:17:55,520 --> 00:17:58,614 you can still see okay the industry 428 00:17:58,614 --> 00:18:01,150 does some [ __ ] again you can still see 429 00:18:01,150 --> 00:18:04,216 the password in the LDAP store right so 430 00:18:04,216 --> 00:18:06,196 the LDAP server has to have a version of 431 00:18:06,196 --> 00:18:08,277 the password to authenticate against and 432 00:18:08,277 --> 00:18:11,000 the industry practice best practice is to 433 00:18:11,000 --> 00:18:12,820 use salted hashes so the password is 434 00:18:12,820 --> 00:18:14,083 not actually in the store 435 00:18:14,569 --> 00:18:17,169 still if someone manages to attack 436 00:18:17,169 --> 00:18:19,749 tinyldap through the blog they can 437 00:18:19,749 --> 00:18:21,689 extract the hashes and try to crack them 438 00:18:21,689 --> 00:18:24,728 but since I'm the only one adding users 439 00:18:24,728 --> 00:18:27,530 I can control the password complexity so 440 00:18:27,530 --> 00:18:29,780 good luck brute forcing that right 441 00:18:32,410 --> 00:18:37,729 okay so this is actually a real problem 442 00:18:37,729 --> 00:18:39,400 not for my blog specifically 443 00:18:39,400 --> 00:18:41,597 but for other web services or services 444 00:18:41,597 --> 00:18:43,310 that are reachable from the internet 445 00:18:43,310 --> 00:18:45,259 what if an attacker doesn't want to steal 446 00:18:45,259 --> 00:18:47,762 my data but it wants to encrypt it 447 00:18:47,762 --> 00:18:50,052 so the ransomware what can you do 448 00:18:50,052 --> 00:18:53,866 about that and my idea was to make 449 00:18:53,866 --> 00:18:55,916 the data store read only so the 450 00:18:55,916 --> 00:18:58,075 LDAP server has a data store that contains 451 00:18:58,075 --> 00:19:00,555 all the blog entries and let's read only 452 00:19:00,555 --> 00:19:03,046 to the add up process you can only read 453 00:19:03,046 --> 00:19:05,129 from it and if you want to write to it 454 00:19:05,129 --> 00:19:08,248 for example to add a new entry it gets 455 00:19:08,248 --> 00:19:10,279 appended to a second file which I call the 456 00:19:10,279 --> 00:19:13,300 journal so SQL databases have a similar 457 00:19:13,300 --> 00:19:15,670 concept and they use it to roll back 458 00:19:15,670 --> 00:19:17,650 transactions I can do the same thing 459 00:19:17,650 --> 00:19:19,160 it's basically a log file 460 00:19:19,160 --> 00:19:23,045 and that means all the differences from 461 00:19:23,045 --> 00:19:25,526 the last time the store was created 462 00:19:25,526 --> 00:19:27,626 the read only store all the differences 463 00:19:27,626 --> 00:19:29,646 are sequentially in the log file 464 00:19:29,646 --> 00:19:32,647 in the journal so that the performance 465 00:19:32,647 --> 00:19:34,847 gets worse the bigger the journal gets 466 00:19:34,847 --> 00:19:37,330 so every now and then I need to combine 467 00:19:37,330 --> 00:19:39,538 the read only part and the journal 468 00:19:39,538 --> 00:19:41,786 a new bigger read only part and 469 00:19:41,786 --> 00:19:43,466 I do that manually 470 00:19:45,729 --> 00:19:48,470 because tinyldap couldn't do it because 471 00:19:48,470 --> 00:19:50,469 I didn't allow tinyldap to write the store 472 00:19:50,469 --> 00:19:52,450 right that was part of the security here 473 00:19:53,010 --> 00:19:56,510 and so with seccomp I can just disable 474 00:19:56,510 --> 00:19:59,000 sys calls I can also install filters so I 475 00:19:59,000 --> 00:20:01,136 can say open is allowed but only if you 476 00:20:01,136 --> 00:20:03,449 use O_APPEND O_APPEND in the open sys 477 00:20:03,449 --> 00:20:06,440 call on Unix means every right you do to 478 00:20:06,440 --> 00:20:09,126 this descriptor is automatically 479 00:20:09,126 --> 00:20:12,425 added to the end so I know if someone 480 00:20:12,425 --> 00:20:16,026 manages to to access the tinyldap 481 00:20:16,026 --> 00:20:18,815 binary and can write to my journal then 482 00:20:18,815 --> 00:20:21,046 the only place the changes can show up 483 00:20:21,046 --> 00:20:23,176 is at the end and that's actually a really 484 00:20:23,176 --> 00:20:25,316 good thing to have because it means 485 00:20:25,316 --> 00:20:27,756 if someone hacks me and adds junk to 486 00:20:27,756 --> 00:20:30,002 my blog I can only remove at the end 487 00:20:30,002 --> 00:20:32,642 and I'm good again compare that to a 488 00:20:32,642 --> 00:20:35,372 usual SQL database if someone wrote 489 00:20:35,372 --> 00:20:38,221 to the database you need to in to play 490 00:20:38,221 --> 00:20:41,176 a backup uh in to restore backup because 491 00:20:41,176 --> 00:20:43,146 they could have changed anything anywhere 492 00:20:43,366 --> 00:20:45,476 right so but tinyldap doesn't even have 493 00:20:45,476 --> 00:20:47,336 file system level permissions to change 494 00:20:47,336 --> 00:20:48,906 anything in the store so I can 495 00:20:48,906 --> 00:20:51,125 re-sleep soundly 496 00:20:51,630 --> 00:20:53,623 yeah the industry spent money on 497 00:20:53,623 --> 00:20:55,503 cyber security mesh architecture 498 00:20:57,160 --> 00:20:59,380 right so the journal integration has 499 00:20:59,380 --> 00:21:01,420 to be done by me manually out of band 500 00:21:01,420 --> 00:21:04,130 so it's not something an automated process 501 00:21:04,130 --> 00:21:06,100 does I do it manually 502 00:21:06,100 --> 00:21:07,819 and when I'm doing it 503 00:21:08,340 --> 00:21:10,360 because it's not that much data it's 504 00:21:10,360 --> 00:21:12,420 like for a week or two I can just read it 505 00:21:12,420 --> 00:21:14,600 again and see if something doesn't look 506 00:21:14,600 --> 00:21:19,120 right this may not be available to all 507 00:21:19,120 --> 00:21:20,990 other scenarios but you have to 508 00:21:20,990 --> 00:21:22,759 realize if you have bigger data it's 509 00:21:22,759 --> 00:21:25,119 usually not all the data that's big 510 00:21:25,119 --> 00:21:27,140 most of it is usually static and read only 511 00:21:27,140 --> 00:21:30,000 and then you have some logs that are 512 00:21:30,000 --> 00:21:32,750 you know billing data that grows and grows 513 00:21:32,750 --> 00:21:35,149 but usually there's part of the data and 514 00:21:35,149 --> 00:21:38,540 this is the part with the you know 515 00:21:38,540 --> 00:21:41,589 identifying information personally or 516 00:21:41,589 --> 00:21:45,520 billing details that stuff is usually 517 00:21:45,520 --> 00:21:48,120 small and mostly static and you could 518 00:21:48,120 --> 00:21:51,440 use this strategy for that too 519 00:21:53,170 --> 00:21:56,629 well yeah okay 520 00:21:57,079 --> 00:21:59,320 so the attacker can still write garbage 521 00:21:59,320 --> 00:22:01,389 to my blog that's still not good 522 00:22:01,389 --> 00:22:03,730 right but since all they can do is append 523 00:22:03,730 --> 00:22:06,481 to the journal I can use my text editor 524 00:22:06,481 --> 00:22:09,001 open the journal and truncate at some 525 00:22:09,001 --> 00:22:11,434 point and then I get all my data back 526 00:22:11,434 --> 00:22:13,784 till the point where they start to [???] 527 00:22:13,784 --> 00:22:16,234 the blog right this is still bad but 528 00:22:16,234 --> 00:22:18,620 it's a very good position to be in 529 00:22:18,620 --> 00:22:21,139 if there's an emergency because you 530 00:22:21,139 --> 00:22:23,750 can basically investigate calmly first 531 00:22:23,750 --> 00:22:26,240 you turn off right write access then you 532 00:22:26,240 --> 00:22:29,439 delete the vandalism and the journal 533 00:22:29,439 --> 00:22:32,599 and you know you haven't lost anything 534 00:22:32,599 --> 00:22:34,740 because if you want to delete an entry 535 00:22:34,740 --> 00:22:36,890 in the blog you could do that too but 536 00:22:36,890 --> 00:22:38,930 that means at the end of the journal you 537 00:22:38,940 --> 00:22:41,200 append a statement saying delete this 538 00:22:41,200 --> 00:22:43,313 record and I can just remove that and I 539 00:22:43,313 --> 00:22:45,730 get the record back right so there's no 540 00:22:45,730 --> 00:22:48,820 way for someone vandalizing my blog to 541 00:22:48,820 --> 00:22:50,940 damage any data that was in it before 542 00:22:50,940 --> 00:22:53,620 all they can do is append junk at the end 543 00:22:53,620 --> 00:22:56,020 and I can live with that right this is 544 00:22:56,020 --> 00:22:58,390 this is should be the guiding thought 545 00:22:58,390 --> 00:23:00,670 between any security you do 546 00:23:00,670 --> 00:23:03,279 if someone hacks you will be in a very 547 00:23:03,279 --> 00:23:05,440 stressful position the boss will be 548 00:23:05,440 --> 00:23:07,749 behind you breathing down your neck are 549 00:23:07,749 --> 00:23:09,889 we done yet? is it fixed? and you want to 550 00:23:09,889 --> 00:23:12,410 have as little to do as possible at that 551 00:23:12,410 --> 00:23:14,672 time you want to to move all the stress 552 00:23:14,672 --> 00:23:17,279 to before you get hacked because then 553 00:23:17,279 --> 00:23:18,740 you have more time 554 00:23:19,840 --> 00:23:22,080 okay the industry did other things again 555 00:23:24,760 --> 00:23:27,940 so what if the attacker doesn't write 556 00:23:27,940 --> 00:23:30,452 garbage to the journal but writes some 557 00:23:30,452 --> 00:23:33,111 exploit to the journal that the next 558 00:23:33,111 --> 00:23:35,312 tinyldap up instance that reads the 559 00:23:35,312 --> 00:23:37,982 journal gets compromised by it 560 00:23:39,430 --> 00:23:42,699 that is a possibility and that would be 561 00:23:42,699 --> 00:23:45,909 bad so agreed that there still a problem 562 00:23:46,409 --> 00:23:49,595 but realize how preposterous the scenario 563 00:23:49,595 --> 00:23:51,734 is so we are talking about an attacker 564 00:23:51,734 --> 00:23:54,655 who found stable zero day in the blog 565 00:23:54,655 --> 00:23:57,105 and then used that and another 566 00:23:57,105 --> 00:23:59,639 stable zero day in tinyldap up to write 567 00:23:59,639 --> 00:24:02,281 to the journal and then have the third 568 00:24:03,051 --> 00:24:06,290 third zero day to compromise the journal 569 00:24:06,290 --> 00:24:08,706 passing code so I mean 570 00:24:08,706 --> 00:24:11,266 yes it is still a problem but we reduced 571 00:24:11,266 --> 00:24:13,800 the risk significantly 572 00:24:14,160 --> 00:24:15,160 and that is what 573 00:24:15,160 --> 00:24:18,320 I'm trying to to tell you here it's not 574 00:24:18,320 --> 00:24:20,704 it's not all or nothing it's good enough 575 00:24:20,704 --> 00:24:24,077 if you can half the risk that's already 576 00:24:24,077 --> 00:24:26,040 very important and you should do it 577 00:24:26,040 --> 00:24:30,620 so as much as you can slice off the risk 578 00:24:30,620 --> 00:24:32,869 the better the better off you will be 579 00:24:32,869 --> 00:24:34,389 if something happens 580 00:24:34,649 --> 00:24:37,698 right because the smaller the code is 581 00:24:37,698 --> 00:24:40,290 that is still attackable the 582 00:24:40,290 --> 00:24:42,160 more you can audit it and be sure it's 583 00:24:42,160 --> 00:24:44,169 good you show it to your friends and 584 00:24:44,169 --> 00:24:46,679 they can audit it too and you 585 00:24:46,679 --> 00:24:48,714 need to save yourself that time because 586 00:24:48,714 --> 00:24:50,714 it happens every now and then that I get 587 00:24:50,714 --> 00:24:52,904 to get to see the whole code base and 588 00:24:52,904 --> 00:24:54,554 the usual code base for commercial 589 00:24:54,554 --> 00:24:57,123 products is like gigabytes of source code 590 00:24:57,123 --> 00:24:59,523 nobody can read that like 591 00:24:59,523 --> 00:25:01,207 I'm good I'm not that good 592 00:25:02,587 --> 00:25:05,407 so this is a good place to be in 593 00:25:05,407 --> 00:25:07,536 I think right so the industry was selling 594 00:25:07,536 --> 00:25:10,256 DDOS mitigation sure whatever 595 00:25:10,326 --> 00:25:11,950 so what happens if someone attacks 596 00:25:11,950 --> 00:25:14,905 the web server that is still a big 597 00:25:14,905 --> 00:25:18,261 problem and it's actually 598 00:25:20,421 --> 00:25:22,562 it's a full damage right 599 00:25:22,562 --> 00:25:24,231 that's the worst that can happen if 600 00:25:24,231 --> 00:25:26,151 someone manages to attack the web server 601 00:25:26,151 --> 00:25:28,431 they can see all traffic coming through 602 00:25:28,431 --> 00:25:30,421 they can look inside TLS secured 603 00:25:30,421 --> 00:25:32,307 connections and they can sniff all the 604 00:25:32,307 --> 00:25:34,721 passwords so that's really bad 605 00:25:34,979 --> 00:25:36,930 unfortunately there is not too much 606 00:25:36,930 --> 00:25:38,619 you can do about that 607 00:25:40,919 --> 00:25:44,256 you could do a separation 608 00:25:44,256 --> 00:25:46,024 so this is something people have been 609 00:25:46,024 --> 00:25:47,955 talking about for a while OpenSSL is 610 00:25:47,955 --> 00:25:49,977 doing this they moved the dangerous crypto 611 00:25:49,977 --> 00:25:51,914 stuff in a second process and use 612 00:25:51,914 --> 00:25:54,218 sandboxing to lock down that process 613 00:25:54,428 --> 00:25:56,289 that could be done but nobody has done 614 00:25:56,289 --> 00:25:58,649 it for OpenSSL yet so OpenSSL doesn't 615 00:25:58,649 --> 00:26:00,689 support that my web server 616 00:26:00,689 --> 00:26:02,929 also supports embed TLS they don't 617 00:26:02,929 --> 00:26:05,158 support that too so I I could spend time 618 00:26:05,158 --> 00:26:06,589 on that and I've been actually 619 00:26:06,589 --> 00:26:09,095 spending some time already but it's not 620 00:26:09,095 --> 00:26:10,959 it's not ready yet but this would be a 621 00:26:10,959 --> 00:26:13,279 good way to reduce the risk and you may 622 00:26:13,279 --> 00:26:15,629 notice that the the tools I'm using to 623 00:26:15,629 --> 00:26:17,779 reduce risks are actually just a handful 624 00:26:17,959 --> 00:26:20,704 there's not it's not you know it's not 625 00:26:20,704 --> 00:26:23,310 witchcraft I'm not inventing new 626 00:26:23,310 --> 00:26:25,589 ways to look at things I'm doing the 627 00:26:25,589 --> 00:26:27,776 same thing again I'm identifying the 628 00:26:27,776 --> 00:26:29,905 part of the code that's dangerous and 629 00:26:29,905 --> 00:26:32,517 then I think about how I can make that 630 00:26:32,517 --> 00:26:34,667 part smaller maybe put it in a different 631 00:26:34,667 --> 00:26:37,296 process lock it down so we need to do 632 00:26:37,296 --> 00:26:38,936 the same thing with the web server 633 00:26:38,936 --> 00:26:40,910 obviously but it's an ongoing process 634 00:26:42,660 --> 00:26:46,710 yeah so again whatever why 635 00:26:46,710 --> 00:26:49,400 haven't I done that yet uh so in my 636 00:26:49,400 --> 00:26:51,375 web server you can it's a build time 637 00:26:51,375 --> 00:26:53,474 decision if you want SSL support or not 638 00:26:53,474 --> 00:26:55,055 and you can see the binary is 639 00:26:55,055 --> 00:26:57,525 significantly bigger if you have SSL 640 00:26:57,525 --> 00:26:59,535 and I'm showing you this because it means 641 00:26:59,535 --> 00:27:01,805 the bulk of the attack surface is the SSL 642 00:27:01,805 --> 00:27:04,730 code it's not my code so if I if I can 643 00:27:04,730 --> 00:27:07,438 put the SSL code in a different process 644 00:27:07,438 --> 00:27:10,740 they still need to see the private key 645 00:27:10,740 --> 00:27:12,267 because that's what TLS needs 646 00:27:12,267 --> 00:27:13,886 the private key otherwise it can't 647 00:27:13,886 --> 00:27:15,927 do the crypto so the bug of the attack 648 00:27:15,927 --> 00:27:17,739 surface would still have access to the 649 00:27:17,739 --> 00:27:19,530 key I can still do it because there 650 00:27:19,530 --> 00:27:21,480 might be bugs in my code and not the 651 00:27:21,480 --> 00:27:24,929 SSL code but that's just 5% of the of 652 00:27:24,929 --> 00:27:27,310 the overall attack surface so 653 00:27:27,730 --> 00:27:29,843 I will probably do it at some point 654 00:27:29,843 --> 00:27:32,125 but it's I don't expect miracles from it 655 00:27:32,125 --> 00:27:35,025 bugs and open SSL will kill me 656 00:27:35,025 --> 00:27:37,241 there's not much I can do about that 657 00:27:39,696 --> 00:27:40,696 laughter 658 00:27:41,820 --> 00:27:44,160 okay so I know what you're thinking 659 00:27:44,220 --> 00:27:47,390 loud laughter 660 00:27:47,530 --> 00:27:50,829 what about kernel bugs? 661 00:27:50,829 --> 00:27:52,455 so I looked at a few of the recent 662 00:27:52,455 --> 00:27:54,679 kernel bugs and it turns out that they 663 00:27:54,679 --> 00:27:56,991 usually apply to sys calls that are rarely 664 00:27:56,991 --> 00:28:00,113 used in regular programs and because 665 00:28:00,113 --> 00:28:01,930 I'm blocking all the sys calls I don't 666 00:28:01,930 --> 00:28:04,220 really need none of them apply to me 667 00:28:04,220 --> 00:28:07,193 right and this is a this is a pattern 668 00:28:07,193 --> 00:28:09,593 with Kernel bugs 669 00:28:09,593 --> 00:28:12,050 there is a project called Sandstorm 670 00:28:13,060 --> 00:28:16,879 that also uses ptrace and seccomp tracing 671 00:28:16,879 --> 00:28:19,049 to reduce the sys call 672 00:28:19,339 --> 00:28:22,266 surface and then puts regular services 673 00:28:22,266 --> 00:28:25,240 into a sandbox for web services and 674 00:28:25,240 --> 00:28:28,290 they evaded all kinds of of Kernel bugs 675 00:28:28,290 --> 00:28:30,309 just because of that so this is 676 00:28:30,309 --> 00:28:32,040 like a zero effort thing because 677 00:28:32,040 --> 00:28:34,740 obviously if you have a list of sys calls 678 00:28:34,740 --> 00:28:36,480 you'd use a white list and you 679 00:28:36,480 --> 00:28:38,110 have a list of things you are 680 00:28:38,110 --> 00:28:40,197 explicitly low and the rest is disabled 681 00:28:40,197 --> 00:28:42,368 not the other way around right 682 00:28:42,478 --> 00:28:44,478 so none of the usual Kernel bugs apply 683 00:28:44,478 --> 00:28:47,056 to me um because of the the seccomp stuff 684 00:28:47,056 --> 00:28:49,337 I already do so Kernel bugs aren't as big 685 00:28:49,337 --> 00:28:51,818 of a problem as you might think at least 686 00:28:51,818 --> 00:28:54,017 I still have them if I haven't patched 687 00:28:54,017 --> 00:28:56,436 but you can't get to them via the blog 688 00:28:57,269 --> 00:28:59,509 so I have a small confession to make 689 00:28:59,509 --> 00:29:01,669 I'm a bit of a troll and that applies 690 00:29:01,669 --> 00:29:05,010 to this project as well so I used the 691 00:29:05,010 --> 00:29:09,719 worst programming language I used C right 692 00:29:09,719 --> 00:29:11,983 so I'm trolling the security people 693 00:29:11,983 --> 00:29:13,746 and then I'm trolling the Java people 694 00:29:13,746 --> 00:29:15,414 who have been saying you should use 695 00:29:15,414 --> 00:29:17,270 multi-threading for performance and not 696 00:29:17,270 --> 00:29:18,604 have one process per request 697 00:29:18,604 --> 00:29:21,307 so I'm doing actually two fork and exec 698 00:29:21,307 --> 00:29:22,377 per request 699 00:29:23,178 --> 00:29:25,133 I'm trolling the database people 700 00:29:25,133 --> 00:29:26,442 I don't have any caching 701 00:29:26,442 --> 00:29:28,042 I don't have connection pools 702 00:29:28,459 --> 00:29:30,290 and the perf people too because I'm 703 00:29:30,290 --> 00:29:32,130 still faster than most of the regular 704 00:29:32,130 --> 00:29:34,639 solutions so there is no there's really 705 00:29:34,639 --> 00:29:36,873 no downside if you if you architect your 706 00:29:36,873 --> 00:29:38,874 software to use this kind of thing 707 00:29:39,444 --> 00:29:41,943 it will be slower than other ways to do it 708 00:29:41,943 --> 00:29:44,343 but most other software isn't as fast 709 00:29:44,343 --> 00:29:47,494 anyway so there's enough headway that 710 00:29:47,494 --> 00:29:49,724 you can use to do security instead of 711 00:29:49,724 --> 00:29:51,923 performance you will still be faster 712 00:29:53,319 --> 00:29:56,150 so let's recap the methodology I used 713 00:29:57,280 --> 00:29:59,549 first I make a list of all the attacks 714 00:29:59,549 --> 00:30:01,276 I can think of and this means 715 00:30:01,276 --> 00:30:03,301 concrete attacks so what could happen 716 00:30:03,301 --> 00:30:04,558 and what would what would 717 00:30:04,558 --> 00:30:06,958 be the problem then right and then 718 00:30:06,958 --> 00:30:09,118 I think for every item on the list 719 00:30:09,118 --> 00:30:11,430 I consider how to prevent this 720 00:30:11,430 --> 00:30:13,964 can I prevent this? what I need to do 721 00:30:13,964 --> 00:30:15,864 and then I do it right so that's easy 722 00:30:15,864 --> 00:30:17,946 it's like this the Feynman problem solving 723 00:30:17,946 --> 00:30:20,323 algorithm in spirit and this 724 00:30:20,323 --> 00:30:23,086 process is called threat modeling it's 725 00:30:23,086 --> 00:30:25,241 it's like a it's dirty word because it 726 00:30:25,241 --> 00:30:27,290 sounds like there's effort involved and 727 00:30:27,290 --> 00:30:29,060 nobody wants to do it but it's really 728 00:30:29,060 --> 00:30:30,913 it's easy it's just these these steps 729 00:30:30,913 --> 00:30:32,893 you look at your software you 730 00:30:32,893 --> 00:30:35,039 consider all the ways it could be attacked 731 00:30:35,039 --> 00:30:36,468 and then you consider what you 732 00:30:36,468 --> 00:30:38,226 could do to prevent the attack or in 733 00:30:38,226 --> 00:30:40,083 some cases you can't prevent the attack 734 00:30:40,083 --> 00:30:42,621 and then you say well that's a risk I have live with 735 00:30:42,621 --> 00:30:44,459 right so that's called threat modeling 736 00:30:44,459 --> 00:30:46,069 you should try it's awesome 737 00:30:48,155 --> 00:30:50,119 and you saw that I'm trying 738 00:30:50,119 --> 00:30:52,490 to optimize something here I go for a 739 00:30:52,490 --> 00:30:55,209 specific target in this case I want 740 00:30:55,209 --> 00:30:57,130 as little code as possible 741 00:30:57,840 --> 00:30:59,910 the more code there is the more bugs 742 00:30:59,910 --> 00:31:01,929 there will be that's an a very old 743 00:31:02,469 --> 00:31:04,830 insight from I think it was originally 744 00:31:04,830 --> 00:31:06,795 in IBM study and they basically found 745 00:31:06,795 --> 00:31:08,755 that the number of bugs in code is a 746 00:31:08,755 --> 00:31:11,124 function of the lines of code in the code 747 00:31:11,124 --> 00:31:12,764 so there's a little more to it but 748 00:31:12,764 --> 00:31:15,334 basically it's true so and it's not just 749 00:31:15,334 --> 00:31:17,174 any code I want to have less of 750 00:31:17,669 --> 00:31:19,529 if the code is dangerous I particularly 751 00:31:19,529 --> 00:31:22,309 want to have less of it and the the most 752 00:31:22,309 --> 00:31:25,046 important category to to make smaller is 753 00:31:25,046 --> 00:31:27,256 the code that enforces security 754 00:31:27,256 --> 00:31:29,496 guarantees so like one security 755 00:31:29,496 --> 00:31:31,466 guarantee would be you can't log in 756 00:31:31,466 --> 00:31:33,505 if you don't have the right password right 757 00:31:33,505 --> 00:31:35,514 so the code that checks that I want it to 758 00:31:35,514 --> 00:31:38,272 be as small as possible one or two 759 00:31:38,272 --> 00:31:40,520 lines of code if I can manage it and 760 00:31:40,520 --> 00:31:42,625 then it's obvious if it if it's wrong or 761 00:31:42,625 --> 00:31:45,175 not the more complex the code is the 762 00:31:45,175 --> 00:31:47,552 less easy would it be to see if 763 00:31:47,552 --> 00:31:49,421 it's correct or not and that's what you 764 00:31:49,421 --> 00:31:51,321 want in the end you want to be sure the 765 00:31:51,321 --> 00:31:53,433 code is correct so how far did I get 766 00:31:53,433 --> 00:31:55,332 it's actually pretty amazing I think 767 00:31:55,332 --> 00:31:58,053 you can write an LDAP server in 5000 lines 768 00:31:58,053 --> 00:32:02,594 of code the blog is 3500 lines of code 769 00:32:02,594 --> 00:32:04,992 plus the LDAP client library 770 00:32:04,992 --> 00:32:06,452 plus zlib 771 00:32:06,682 --> 00:32:09,159 but I'm only using zlib to compress not to 772 00:32:09,159 --> 00:32:11,480 decompress so most attack scenarios 773 00:32:11,480 --> 00:32:13,997 doesn't don't apply to to my usage of zlib 774 00:32:13,997 --> 00:32:16,758 and the web server is also pretty slow 775 00:32:16,758 --> 00:32:18,424 if you only look at the HTTP code 776 00:32:18,424 --> 00:32:21,223 unfortunately it also contains the 777 00:32:21,223 --> 00:32:23,627 SSL Library which is orders of magnitude 778 00:32:23,627 --> 00:32:26,006 more than my code and that's how you 779 00:32:28,039 --> 00:32:31,840 want it you want the biggest risk not to 780 00:32:28,039 --> 00:32:34,519 be in the new code but in an old code 781 00:32:31,840 --> 00:32:36,440 that someone else already audited if you 782 00:32:34,519 --> 00:32:38,760 can manage it right so this is the 783 00:32:36,440 --> 00:32:40,840 optimization strategy try to have as 784 00:32:38,760 --> 00:32:42,960 little dangerous code as possible sounds 785 00:32:40,840 --> 00:32:44,679 like a no-brainer but if you look at 786 00:32:42,960 --> 00:32:47,279 modern software development you will 787 00:32:44,679 --> 00:32:50,120 find out they do the exact opposite pull 788 00:32:47,279 --> 00:32:53,159 in as many Frameworks as as they 789 00:32:50,120 --> 00:32:55,639 can so this strategy is called TCB 790 00:32:53,159 --> 00:32:57,159 minimization you should try it and I 791 00:32:55,639 --> 00:33:01,240 gave a talk about it already it's 792 00:32:57,159 --> 00:33:05,080 actually pretty easy so um I told you 793 00:33:01,240 --> 00:33:08,080 what I did to the to the blog to uh uh 794 00:33:05,080 --> 00:33:10,120 diminish the danger that can be done uh 795 00:33:08,080 --> 00:33:11,919 if someone manages to take it over and 796 00:33:10,120 --> 00:33:15,000 this is actually part of the TCB 797 00:33:11,919 --> 00:33:18,279 minimization process so the blog was a 798 00:33:15,000 --> 00:33:21,440 high risk area and then I took away 799 00:33:18,279 --> 00:33:24,000 Privileges and removed exess checks and 800 00:33:21,440 --> 00:33:26,240 in the end even if I give you remote 801 00:33:24,000 --> 00:33:28,200 code execution in the blog process you 802 00:33:26,240 --> 00:33:30,679 can't do anything you couldn't do before 803 00:33:28,200 --> 00:33:33,519 right so it's no longer part of the TCB 804 00:33:30,679 --> 00:33:35,559 the TCB is the part that uh enforces 805 00:33:33,519 --> 00:33:36,880 security guarantees which the block CGI 806 00:33:35,559 --> 00:33:39,440 doesn't 807 00:33:36,880 --> 00:33:41,360 anymore so that's what you want to do 808 00:33:39,440 --> 00:33:44,200 you want to end up in the smallest TCB 809 00:33:41,360 --> 00:33:47,200 you can possibly manage and uh every 810 00:33:44,200 --> 00:33:49,360 step on the way is good so no step is 811 00:33:47,200 --> 00:33:51,880 too small right if you can shave off 812 00:33:49,360 --> 00:33:54,639 even a little routine do 813 00:33:51,880 --> 00:33:56,960 it this is the minimization part of TCB 814 00:33:54,639 --> 00:33:59,799 minimization right I could I was able to 815 00:33:56,960 --> 00:34:03,639 remove the block from the TCB tiny El up 816 00:33:59,799 --> 00:34:05,360 still still has a risk so I I you saw 817 00:34:03,639 --> 00:34:07,279 the threat model if someone manages to 818 00:34:05,360 --> 00:34:08,639 take over tiny El up they can read the 819 00:34:07,279 --> 00:34:11,440 hashes and try to crack them that's 820 00:34:08,639 --> 00:34:14,639 still bad um but I can live with it 821 00:34:11,440 --> 00:34:17,399 right uh if they vandalize the block I 822 00:34:14,639 --> 00:34:19,960 can undo the damage without going to the 823 00:34:17,399 --> 00:34:22,280 tape Library so that's 824 00:34:19,960 --> 00:34:23,960 good if you compare that to the industry 825 00:34:22,280 --> 00:34:26,720 standard you you will find that my 826 00:34:23,960 --> 00:34:28,560 Approach is much better um usually in 827 00:34:26,720 --> 00:34:31,200 the industry you see platform decisions 828 00:34:28,560 --> 00:34:33,480 done by management not by the techies 829 00:34:31,200 --> 00:34:35,399 and um it's untroubled by expertise or 830 00:34:33,480 --> 00:34:37,800 risk analysis and you you get a 831 00:34:35,399 --> 00:34:39,720 diffusion of responsibility because if 832 00:34:37,800 --> 00:34:41,599 you even if you try to find out who's 833 00:34:39,720 --> 00:34:43,240 responsible for anything you find uh 834 00:34:41,599 --> 00:34:44,960 well it's that team over there but we 835 00:34:43,240 --> 00:34:47,040 don't really know and then you find out 836 00:34:44,960 --> 00:34:48,159 the team dissolved last week and it's 837 00:34:47,040 --> 00:34:50,919 really 838 00:34:48,159 --> 00:34:54,560 horrible and brand new we have ai tools 839 00:34:50,919 --> 00:34:54,560 which is also a diffusion of 840 00:34:55,200 --> 00:34:59,000 responsibility and then you get people 841 00:34:57,160 --> 00:35:00,880 arguing well it's so bad it can't get 842 00:34:59,000 --> 00:35:02,760 any worse let's go to the cloud where 843 00:35:00,880 --> 00:35:07,079 obviously it gets worse 844 00:35:02,760 --> 00:35:08,520 immediately so I prefer my way um I 845 00:35:07,079 --> 00:35:10,640 think in the end it's important to 846 00:35:08,520 --> 00:35:12,920 realize that the the lack of security 847 00:35:10,640 --> 00:35:16,440 you may have in your projects right now 848 00:35:12,920 --> 00:35:18,400 is self-imposed there is no guy with a 849 00:35:16,440 --> 00:35:20,480 shotgun behind you 850 00:35:18,400 --> 00:35:23,800 threatening you can do it you just have 851 00:35:20,480 --> 00:35:25,640 to start right so this is self-imposed 852 00:35:23,800 --> 00:35:28,800 helplessness you can actually help 853 00:35:25,640 --> 00:35:28,800 yourself you just have to start 854 00:35:29,440 --> 00:35:34,160 right how did we get here this is 855 00:35:32,079 --> 00:35:36,119 obviously not a good good place to be 856 00:35:34,160 --> 00:35:37,800 like all the software is crappy and 857 00:35:36,119 --> 00:35:40,200 there's a few it's not just that people 858 00:35:37,800 --> 00:35:43,440 are dumb there's a few reasons for that 859 00:35:40,200 --> 00:35:45,359 so um back in the day you used to have 860 00:35:43,440 --> 00:35:48,200 bespoke applications that were written 861 00:35:45,359 --> 00:35:50,079 for a specific purpose and they used the 862 00:35:48,200 --> 00:35:52,359 waterfall model and you had the 863 00:35:50,079 --> 00:35:55,560 requirements specification and it was 864 00:35:52,359 --> 00:35:58,079 lots of bureaucracy and really horrible 865 00:35:55,560 --> 00:36:00,200 but it also Al meant that you knew what 866 00:35:58,079 --> 00:36:02,880 the application had be had to be able to 867 00:36:00,200 --> 00:36:06,240 do so that means you can make sure 868 00:36:02,880 --> 00:36:08,079 anything else is forbidden if you know 869 00:36:06,240 --> 00:36:10,040 what the application needs to be able to 870 00:36:08,079 --> 00:36:12,400 do you can make sure it doesn't do any 871 00:36:10,040 --> 00:36:15,520 other stuff and that is security if you 872 00:36:12,400 --> 00:36:17,280 think about it deny everything that the 873 00:36:15,520 --> 00:36:19,280 application wasn't supposed to be doing 874 00:36:17,280 --> 00:36:22,200 and then that's what an attacker would 875 00:36:19,280 --> 00:36:24,680 do if they take over the machine right 876 00:36:22,200 --> 00:36:26,240 so if you know beforehand what you're 877 00:36:24,680 --> 00:36:28,680 trying to get to you can actually 878 00:36:26,240 --> 00:36:30,319 implement privilege even architecturally 879 00:36:28,680 --> 00:36:32,920 as I've shown 880 00:36:30,319 --> 00:36:35,720 you now we have more of an Ikea model 881 00:36:32,920 --> 00:36:37,560 you buy parts that are uh designed by 882 00:36:35,720 --> 00:36:39,359 their own teams and the teams designing 883 00:36:37,560 --> 00:36:42,440 the parts don't know what the final 884 00:36:39,359 --> 00:36:44,240 product will look like right in in some 885 00:36:42,440 --> 00:36:45,640 cases even you don't know what the final 886 00:36:44,240 --> 00:36:47,920 product will look like but it's even 887 00:36:45,640 --> 00:36:49,880 worse if you consider that the the the 888 00:36:47,920 --> 00:36:51,480 team building the part you make your 889 00:36:49,880 --> 00:36:53,760 software from doesn't know what it will 890 00:36:51,480 --> 00:36:56,359 be used for so it has to be as generic 891 00:36:53,760 --> 00:36:57,839 as possible Right the more it can be 892 00:36:56,359 --> 00:37:00,680 done with with it the better and that's 893 00:36:57,839 --> 00:37:03,119 the opposite of security right security 894 00:37:00,680 --> 00:37:05,359 means understanding what you need to do 895 00:37:03,119 --> 00:37:08,599 and then disallowing the rest and this 896 00:37:05,359 --> 00:37:11,440 means be as generic as you can the parts 897 00:37:08,599 --> 00:37:12,400 are optimized for genericity Gen what's 898 00:37:11,440 --> 00:37:15,599 the 899 00:37:12,400 --> 00:37:17,680 name genericism I don't know so they are 900 00:37:15,599 --> 00:37:21,319 optimized to be as flexible as possible 901 00:37:17,680 --> 00:37:21,319 and they are chosen by 902 00:37:21,599 --> 00:37:25,079 flexibility the developer of the part 903 00:37:23,640 --> 00:37:27,599 usually has no idea what it would used 904 00:37:25,079 --> 00:37:31,040 for uh and that means you can't do least 905 00:37:27,599 --> 00:37:33,760 privilege because um you don't know what 906 00:37:31,040 --> 00:37:36,319 the privilege will be that's least so 907 00:37:33,760 --> 00:37:38,520 this this is actually a big mess so if 908 00:37:36,319 --> 00:37:40,480 you use Parts programmed by other people 909 00:37:38,520 --> 00:37:42,680 you will have to invest extra effort to 910 00:37:40,480 --> 00:37:45,480 find out what kind of stuff you can make 911 00:37:42,680 --> 00:37:47,599 it not do because it will definitely be 912 00:37:45,480 --> 00:37:49,440 able to do more than you need and the 913 00:37:47,599 --> 00:37:52,040 more you can clamp down the more 914 00:37:49,440 --> 00:37:53,720 security you will have uh it's even 915 00:37:52,040 --> 00:37:55,079 worse if you do Agile development 916 00:37:53,720 --> 00:37:58,079 because then by definition you don't 917 00:37:55,079 --> 00:37:59,520 know what the end result will be so if 918 00:37:58,079 --> 00:38:00,880 you don't know that you can't do 919 00:37:59,520 --> 00:38:03,319 security 920 00:38:00,880 --> 00:38:05,640 lockdown so another argument why we got 921 00:38:03,319 --> 00:38:07,520 here is economics of scale so it used to 922 00:38:05,640 --> 00:38:10,880 be that if you build some kind of device 923 00:38:07,520 --> 00:38:13,280 that needs to do something like I don't 924 00:38:10,880 --> 00:38:17,400 know uh a 925 00:38:13,280 --> 00:38:19,680 microwave then you you find parts and 926 00:38:17,400 --> 00:38:21,359 you combine the parts and you solder 927 00:38:19,680 --> 00:38:24,119 them together and then they solve the 928 00:38:21,359 --> 00:38:27,160 problem but these days uh you don't 929 00:38:24,119 --> 00:38:29,680 solder parts anymore you assemble from 930 00:38:27,160 --> 00:38:32,280 pre-made parts and these are usually 931 00:38:29,680 --> 00:38:35,280 programmable right so a little arm chip 932 00:38:32,280 --> 00:38:37,040 cost like a tenth of a scent so why use 933 00:38:35,280 --> 00:38:38,800 a special part if you can use an arm 934 00:38:37,040 --> 00:38:40,880 chip and then program it but that means 935 00:38:38,800 --> 00:38:43,000 you still need to use software that 936 00:38:40,880 --> 00:38:44,640 actually solves the problem the hardware 937 00:38:43,000 --> 00:38:47,000 is generic and that means the hardware 938 00:38:44,640 --> 00:38:49,800 can be hacked and this is turning out to 939 00:38:47,000 --> 00:38:53,359 be a problem right if you had a break in 940 00:38:49,800 --> 00:38:54,640 in 20 years youo um it it breaked right 941 00:38:53,359 --> 00:38:57,040 but now it's 942 00:38:54,640 --> 00:38:59,040 programmable and people have realized 943 00:38:57,040 --> 00:39:01,200 how bad that is but it is bad right so 944 00:38:59,040 --> 00:39:05,480 that's that will bite Us in the 945 00:39:01,200 --> 00:39:07,680 ass oops so um the response from the 946 00:39:05,480 --> 00:39:10,440 industry has so far been the ostrich 947 00:39:07,680 --> 00:39:13,000 method basically we we install stuff 948 00:39:10,440 --> 00:39:14,880 that we know is untrustworthy and so we 949 00:39:13,000 --> 00:39:17,680 install other stuff on top of it that's 950 00:39:14,880 --> 00:39:20,720 also untrustworthy and then we call it 951 00:39:17,680 --> 00:39:24,119 Telemetry or big data and to some risk 952 00:39:20,720 --> 00:39:26,599 uh logging analysis in in aze or 953 00:39:24,119 --> 00:39:29,640 whatever uh and in the end the attack 954 00:39:26,599 --> 00:39:31,839 surface has mushroomed like a nuclear 955 00:39:29,640 --> 00:39:34,240 explosion right so that's our fault 956 00:39:31,839 --> 00:39:36,000 nobody has forced us to do this you 957 00:39:34,240 --> 00:39:39,079 don't need to do this in your own 958 00:39:36,000 --> 00:39:41,119 projects that's the hopeful message of 959 00:39:39,079 --> 00:39:42,640 this talk in conclusion if you remember 960 00:39:41,119 --> 00:39:44,079 nothing else from this talk remember 961 00:39:42,640 --> 00:39:46,520 that threat modeling is a thing and you 962 00:39:44,079 --> 00:39:48,480 should try it TCB minimization actually 963 00:39:46,520 --> 00:39:51,680 helps least privilege is another facet 964 00:39:48,480 --> 00:39:53,800 of the same thing and if you can uh use 965 00:39:51,680 --> 00:39:56,440 a pendon data storage you should 966 00:39:53,800 --> 00:39:58,359 consider it hm blockchain yeah not 967 00:39:56,440 --> 00:40:00,560 blockchain a pend only data storage it's 968 00:39:58,359 --> 00:40:00,560 not 969 00:40:00,630 --> 00:40:08,820 [Applause] 970 00:40:09,000 --> 00:40:13,240 [Music] 971 00:40:10,720 --> 00:40:15,200 blockchain so two more you two more 972 00:40:13,240 --> 00:40:18,160 slides yeah two more slides sorry I'm an 973 00:40:15,200 --> 00:40:20,480 imposter no problem so the rule of thumb 974 00:40:18,160 --> 00:40:23,480 should be if if the blog of some 975 00:40:20,480 --> 00:40:26,160 unwashed hobbyist from the Internet is 976 00:40:23,480 --> 00:40:28,040 more secure than your it security then 977 00:40:26,160 --> 00:40:30,359 you should improve your it 978 00:40:28,040 --> 00:40:33,760 security right that shouldn't 979 00:40:30,359 --> 00:40:35,400 happen all right so that's all from my 980 00:40:33,760 --> 00:40:38,319 talk I think we still have time for 981 00:40:35,400 --> 00:40:41,560 questions do we yes okay awesome okay 982 00:40:38,319 --> 00:40:41,560 now you can put your hand 983 00:40:45,040 --> 00:40:49,599 [Applause] 984 00:40:47,280 --> 00:40:51,280 together so if you want to ask a 985 00:40:49,599 --> 00:40:55,720 question we have four microphones in the 986 00:40:51,280 --> 00:40:56,880 room 1 2 3 4 and I'm going to take a a 987 00:40:55,720 --> 00:40:59,760 question the first first question from 988 00:40:56,880 --> 00:41:02,359 the internet the internet is saying you 989 00:40:59,760 --> 00:41:03,400 actually got hacked or can you elaborate 990 00:41:02,359 --> 00:41:05,599 on what 991 00:41:03,400 --> 00:41:07,119 happened Yes actually there was an 992 00:41:05,599 --> 00:41:08,680 incident where someone was able to post 993 00:41:07,119 --> 00:41:11,119 stuff to my blog and because I had a 994 00:41:08,680 --> 00:41:14,640 pend only data storage I Shrugged it off 995 00:41:11,119 --> 00:41:16,520 basically so use use a pendon data 996 00:41:14,640 --> 00:41:19,480 storage it's it will save your ass at 997 00:41:16,520 --> 00:41:22,079 some point the problem was a bug in my 998 00:41:19,480 --> 00:41:23,960 uh Access Control lists I had used some 999 00:41:22,079 --> 00:41:26,440 some Access Control list in my alab 1000 00:41:23,960 --> 00:41:27,880 server and I had a line in it that I 1001 00:41:26,440 --> 00:41:29,760 should have removed but I forgot to 1002 00:41:27,880 --> 00:41:33,200 remove it and that meant you could post 1003 00:41:29,760 --> 00:41:35,200 without having credentials but um it 1004 00:41:33,200 --> 00:41:38,040 happened and it wasn't bad because my 1005 00:41:35,200 --> 00:41:39,599 architecture prevented damage um as 1006 00:41:38,040 --> 00:41:42,440 people are leaving the room could you 1007 00:41:39,599 --> 00:41:44,760 leave very quietly thank you um 1008 00:41:42,440 --> 00:41:47,119 microphone number one yeah is there a 1009 00:41:44,760 --> 00:41:50,520 second alternative for Windows and Mac 1010 00:41:47,119 --> 00:41:52,720 OS a secure alternative well so 1011 00:41:50,520 --> 00:41:56,359 basically you can do the the principles 1012 00:41:52,720 --> 00:42:00,000 I um I showed in this talk you can do on 1013 00:41:56,359 --> 00:42:02,560 those two so usually you will not be 1014 00:42:00,000 --> 00:42:05,359 hacked because your your Mac OS or 1015 00:42:02,560 --> 00:42:07,079 Windows had a bug I that happens too but 1016 00:42:05,359 --> 00:42:09,319 the bigger problem is that the software 1017 00:42:07,079 --> 00:42:11,800 you wrote had a bug or that you the 1018 00:42:09,319 --> 00:42:14,480 software that you use had a bug so I'm 1019 00:42:11,800 --> 00:42:16,560 I'm trying to tell you Linux isn't uh 1020 00:42:14,480 --> 00:42:18,520 particularly more secure than Windows 1021 00:42:16,560 --> 00:42:20,599 it's just it's basically you can write 1022 00:42:18,520 --> 00:42:22,839 secure software and insecure software on 1023 00:42:20,599 --> 00:42:25,160 any operating system you should still 1024 00:42:22,839 --> 00:42:26,720 use Linux because it has advantages but 1025 00:42:25,160 --> 00:42:28,880 if you apply these Tech techniques to 1026 00:42:26,720 --> 00:42:31,720 your software it will be secure on on 1027 00:42:28,880 --> 00:42:34,480 Mac OS and windows as well right so this 1028 00:42:31,720 --> 00:42:36,040 is not for for end users selecting the 1029 00:42:34,480 --> 00:42:37,319 software if you select software you have 1030 00:42:36,040 --> 00:42:39,520 to trust the 1031 00:42:37,319 --> 00:42:42,200 vendor there's no way around that but if 1032 00:42:39,520 --> 00:42:44,280 you write your own software then you can 1033 00:42:42,200 --> 00:42:46,960 reduce the risk to a point where you can 1034 00:42:44,280 --> 00:42:49,119 live with it and sleep soundly sure is 1035 00:42:46,960 --> 00:42:51,359 there a a technical alternative or 1036 00:42:49,119 --> 00:42:53,119 similar similarity like sa comp for 1037 00:42:51,359 --> 00:42:54,760 Windows and Mac OS so can you drop your 1038 00:42:53,119 --> 00:42:57,960 privileges after you have opened a file 1039 00:42:54,760 --> 00:42:59,960 for example uh uh so for meos I'm not 1040 00:42:57,960 --> 00:43:02,680 sure but I know that that free BSD net 1041 00:42:59,960 --> 00:43:05,440 BSD and open BSD have an an equivalent 1042 00:43:02,680 --> 00:43:08,119 thing I think uh Macos has it too but 1043 00:43:05,440 --> 00:43:09,920 I'm I'm not sure about that for Windows 1044 00:43:08,119 --> 00:43:11,559 there's are sandboxing methods you can 1045 00:43:09,920 --> 00:43:13,359 look at the Chrome source code for 1046 00:43:11,559 --> 00:43:16,440 example they have a Sandbox it's open 1047 00:43:13,359 --> 00:43:18,960 source you can use that to do this kind 1048 00:43:16,440 --> 00:43:21,720 of thing okay thanks so microphone 1049 00:43:18,960 --> 00:43:23,800 number two except down that's gone so 1050 00:43:21,720 --> 00:43:27,160 microphone number three in that 1051 00:43:23,800 --> 00:43:29,480 case this is four I sorry four four yes 1052 00:43:27,160 --> 00:43:31,720 um will your next talk be about writing 1053 00:43:29,480 --> 00:43:33,559 software secure software in Windows and 1054 00:43:31,720 --> 00:43:35,559 if no uh how much assets would you 1055 00:43:33,559 --> 00:43:38,119 request to compensate for all the 1056 00:43:35,559 --> 00:43:41,839 pain 1057 00:43:38,119 --> 00:43:45,960 no it's not a question of 1058 00:43:41,839 --> 00:43:48,359 money okay uh microphone one um have you 1059 00:43:45,960 --> 00:43:49,440 tried removing unnecessary features from 1060 00:43:48,359 --> 00:43:52,240 open 1061 00:43:49,440 --> 00:43:54,680 SSL uh Yes actually I've I've done this 1062 00:43:52,240 --> 00:43:56,680 pretty pretty early but it's still it's 1063 00:43:54,680 --> 00:44:00,000 still much bigger than my code 1064 00:43:56,680 --> 00:44:03,440 so um for example op SSL has support for 1065 00:44:00,000 --> 00:44:05,119 UDP based TLs but there's a lot of 1066 00:44:03,440 --> 00:44:06,960 shared cyers in there you can remove 1067 00:44:05,119 --> 00:44:08,720 ciphers you don't need and and that 1068 00:44:06,960 --> 00:44:11,880 helps a bit but it's still it's the 1069 00:44:08,720 --> 00:44:14,720 biggest part of the web server by far I 1070 00:44:11,880 --> 00:44:18,200 think there was an internet question was 1071 00:44:14,720 --> 00:44:21,640 there no doesn't look like 1072 00:44:18,200 --> 00:44:22,839 yes no yes no no yes okay uh then 1073 00:44:21,640 --> 00:44:27,200 microphone 1074 00:44:22,839 --> 00:44:29,640 four as someone who is uh connected or 1075 00:44:27,200 --> 00:44:31,880 was connected to an industry which has 1076 00:44:29,640 --> 00:44:34,200 programming programmable 1077 00:44:31,880 --> 00:44:37,960 brakes 1078 00:44:34,200 --> 00:44:39,480 um what is your opinion about things 1079 00:44:37,960 --> 00:44:42,440 like 1080 00:44:39,480 --> 00:44:44,079 mizra well well so there are standards 1081 00:44:42,440 --> 00:44:45,240 in the automotive industry for example 1082 00:44:44,079 --> 00:44:48,040 like misra 1083 00:44:45,240 --> 00:44:50,359 to make sure you write better code and 1084 00:44:48,040 --> 00:44:52,520 it's mostly compliance so they give you 1085 00:44:50,359 --> 00:44:55,280 rules like um you shouldn't use 1086 00:44:52,520 --> 00:44:56,960 recursion in your code for example and 1087 00:44:55,280 --> 00:44:59,000 the functions should would be this big 1088 00:44:56,960 --> 00:45:01,640 at at most and this is more I mean it 1089 00:44:59,000 --> 00:45:03,440 will probably help a bit but it's much 1090 00:45:01,640 --> 00:45:05,800 better to to invest in in good 1091 00:45:03,440 --> 00:45:09,440 architecture but you may have noticed I 1092 00:45:05,800 --> 00:45:11,200 I've said I wrote the code in C and I 1093 00:45:09,440 --> 00:45:13,800 said nothing about what I did to make 1094 00:45:11,200 --> 00:45:15,880 sure it's it's good code so that's 1095 00:45:13,800 --> 00:45:17,559 that's a different dimension that's 1096 00:45:15,880 --> 00:45:20,800 orthogonal right 1097 00:45:17,559 --> 00:45:22,280 so follow those standards it will it 1098 00:45:20,800 --> 00:45:25,040 will make your code a bit better 1099 00:45:22,280 --> 00:45:26,640 probably um but it won't solve all the 1100 00:45:25,040 --> 00:45:29,040 problems and I think personally you 1101 00:45:26,640 --> 00:45:30,760 should do both you should make sure or 1102 00:45:29,040 --> 00:45:32,520 try to make sure that there's as little 1103 00:45:30,760 --> 00:45:34,160 bugs as possible in your code there's 1104 00:45:32,520 --> 00:45:36,079 ways to do that I had to talk about that 1105 00:45:34,160 --> 00:45:37,760 too but after you do that you should 1106 00:45:36,079 --> 00:45:40,200 still have these kind of 1107 00:45:37,760 --> 00:45:41,720 architectural guide guard rails that 1108 00:45:40,200 --> 00:45:44,079 keep you on track even if someone 1109 00:45:41,720 --> 00:45:46,240 manages to take over the 1110 00:45:44,079 --> 00:45:47,280 process so now I think there was an 1111 00:45:46,240 --> 00:45:50,599 internet 1112 00:45:47,280 --> 00:45:53,520 question yes uh the internet is asking 1113 00:45:50,599 --> 00:45:55,559 how would it work to like scale This 1114 00:45:53,520 --> 00:45:58,839 truly impressive security architecture 1115 00:45:55,559 --> 00:46:01,400 up for more use cases and more like 1116 00:45:58,839 --> 00:46:04,880 larger theme or would the theme size and 1117 00:46:01,400 --> 00:46:09,040 the feature keep ruin it yes 1118 00:46:04,880 --> 00:46:09,040 so oh no oh 1119 00:46:09,070 --> 00:46:15,839 [Laughter] 1120 00:46:12,319 --> 00:46:15,839 no well I'm 1121 00:46:24,800 --> 00:46:27,800 sorry 1122 00:46:28,470 --> 00:46:36,780 [Music] 1123 00:46:37,760 --> 00:46:40,760 la