|
1 |
| -# tar-fs |
2 |
| - |
3 |
| -filesystem bindings for [tar-stream](https://github.com/mafintosh/tar-stream). |
4 |
| - |
5 |
| -``` |
6 |
| -npm install tar-fs |
7 |
| -``` |
8 |
| - |
9 |
| -[](http://travis-ci.org/mafintosh/tar-fs) |
10 |
| - |
11 |
| -## Usage |
12 |
| - |
13 |
| -tar-fs allows you to pack directories into tarballs and extract tarballs into directories. |
14 |
| - |
15 |
| -It doesn't gunzip for you, so if you want to extract a `.tar.gz` with this you'll need to use something like [gunzip-maybe](https://github.com/mafintosh/gunzip-maybe) in addition to this. |
16 |
| - |
17 |
| -``` js |
18 |
| -var tar = require('tar-fs') |
19 |
| -var fs = require('fs') |
20 |
| - |
21 |
| -// packing a directory |
22 |
| -tar.pack('./my-directory').pipe(fs.createWriteStream('my-tarball.tar')) |
23 |
| - |
24 |
| -// extracting a directory |
25 |
| -fs.createReadStream('my-other-tarball.tar').pipe(tar.extract('./my-other-directory')) |
26 |
| -``` |
27 |
| - |
28 |
| -To ignore various files when packing or extracting add a ignore function to the options. `ignore` |
29 |
| -is also an alias for `filter`. Additionally you get `header` if you use ignore while extracting. |
30 |
| -That way you could also filter by metadata. |
31 |
| - |
32 |
| -``` js |
33 |
| -var pack = tar.pack('./my-directory', { |
34 |
| - ignore: function(name) { |
35 |
| - return path.extname(name) === '.bin' // ignore .bin files when packing |
36 |
| - } |
37 |
| -}) |
38 |
| - |
39 |
| -var extract = tar.extract('./my-other-directory', { |
40 |
| - ignore: function(name) { |
41 |
| - return path.extname(name) === '.bin' // ignore .bin files inside the tarball when extracing |
42 |
| - } |
43 |
| -}) |
44 |
| - |
45 |
| -var extractFilesDirs = tar.extract('./my-other-other-directory', { |
46 |
| - ignore: function(_, header) { |
47 |
| - // pass files & directories, ignore e.g. symlinks |
48 |
| - return header.type !== 'file' && header.type !== 'directory' |
49 |
| - } |
50 |
| -}) |
51 |
| -``` |
52 |
| - |
53 |
| -You can also specify which entries to pack using the `entries` option |
54 |
| - |
55 |
| -```js |
56 |
| -var pack = tar.pack('./my-directory', { |
57 |
| - entries: ['file1', 'subdir/file2'] // only the specific entries will be packed |
58 |
| -}) |
59 |
| -``` |
60 |
| - |
61 |
| -If you want to modify the headers when packing/extracting add a map function to the options |
| 1 | +# Code Scanning Javascript Tutorial |
62 | 2 |
|
63 |
| -``` js |
64 |
| -var pack = tar.pack('./my-directory', { |
65 |
| - map: function(header) { |
66 |
| - header.name = 'prefixed/'+header.name |
67 |
| - return header |
68 |
| - } |
69 |
| -}) |
| 3 | +Welcome to the Code Scanning Javascript Tutorial! This tutorial will take you through how to set up Github Advanced Security: Code Scanning as well as interpret results that it may find. The following repository contains vulnerability [CVE-2018-20835](https://github.com/advisories/GHSA-x2mc-8fgj-3wmr) (aka Zip Slip) that was found by the [GitHub Security Lab](https://securitylab.github.com/). |
70 | 4 |
|
71 |
| -var extract = tar.extract('./my-directory', { |
72 |
| - map: function(header) { |
73 |
| - header.name = 'another-prefix/'+header.name |
74 |
| - return header |
75 |
| - } |
76 |
| -}) |
77 |
| -``` |
| 5 | +## Introduction |
78 | 6 |
|
79 |
| -Similarly you can use `mapStream` incase you wanna modify the input/output file streams |
| 7 | +Code scanning is a feature that you use to analyze the code in a GitHub repository to find security vulnerabilities and coding errors. Any problems identified by the analysis are shown in GitHub. |
80 | 8 |
|
81 |
| -``` js |
82 |
| -var pack = tar.pack('./my-directory', { |
83 |
| - mapStream: function(fileStream, header) { |
84 |
| - if (path.extname(header.name) === '.js') { |
85 |
| - return fileStream.pipe(someTransform) |
86 |
| - } |
87 |
| - return fileStream; |
88 |
| - } |
89 |
| -}) |
| 9 | +You can use code scanning with CodeQL, a semantic code analysis engine. CodeQL treats code as data, allowing you to find potential vulnerabilities in your code with greater confidence than traditional static analyzers. |
90 | 10 |
|
91 |
| -var extract = tar.extract('./my-directory', { |
92 |
| - mapStream: function(fileStream, header) { |
93 |
| - if (path.extname(header.name) === '.js') { |
94 |
| - return fileStream.pipe(someTransform) |
95 |
| - } |
96 |
| - return fileStream; |
97 |
| - } |
98 |
| -}) |
99 |
| -``` |
| 11 | +This tutorial with use CodeQL Analysis with Code Scanning in order to search for vulnerabilities within your code. |
100 | 12 |
|
101 |
| -Set `options.fmode` and `options.dmode` to ensure that files/directories extracted have the corresponding modes |
| 13 | +## Instructions |
102 | 14 |
|
103 |
| -``` js |
104 |
| -var extract = tar.extract('./my-directory', { |
105 |
| - dmode: parseInt(555, 8), // all dirs should be readable |
106 |
| - fmode: parseInt(444, 8) // all files should be readable |
107 |
| -}) |
108 |
| -``` |
109 |
| - |
110 |
| -It can be useful to use `dmode` and `fmode` if you are packing/unpacking tarballs between *nix/windows to ensure that all files/directories unpacked are readable. |
111 |
| - |
112 |
| -Alternatively you can set `options.readable` and/or `options.writable` to set the dmode and fmode to readable/writable. |
113 |
| - |
114 |
| -``` js |
115 |
| -var extract = tar.extract('./my-directory', { |
116 |
| - readable: true, // all dirs and files should be readable |
117 |
| - writable: true, // all dirs and files should be writable |
118 |
| -}) |
119 |
| -``` |
120 |
| - |
121 |
| -Set `options.strict` to `false` if you want to ignore errors due to unsupported entry types (like device files) |
122 |
| - |
123 |
| -To dereference symlinks (pack the contents of the symlink instead of the link itself) set `options.dereference` to `true`. |
124 |
| - |
125 |
| -## Copy a directory |
126 |
| - |
127 |
| -Copying a directory with permissions and mtime intact is as simple as |
128 |
| - |
129 |
| -``` js |
130 |
| -tar.pack('source-directory').pipe(tar.extract('dest-directory')) |
131 |
| -``` |
132 |
| - |
133 |
| -## Interaction with [`tar-stream`](https://github.com/mafintosh/tar-stream) |
134 |
| - |
135 |
| -Use `finalize: false` and the `finish` hook to |
136 |
| -leave the pack stream open for further entries (see |
137 |
| -[`tar-stream#pack`](https://github.com/mafintosh/tar-stream#packing)), |
138 |
| -and use `pack` to pass an existing pack stream. |
139 |
| - |
140 |
| -``` js |
141 |
| -var mypack = tar.pack('./my-directory', { |
142 |
| - finalize: false, |
143 |
| - finish: function(sameAsMypack) { |
144 |
| - mypack.entry({name: 'generated-file.txt'}, "hello") |
145 |
| - tar.pack('./other-directory', { |
146 |
| - pack: sameAsMypack |
147 |
| - }) |
148 |
| - } |
149 |
| -}) |
150 |
| -``` |
151 |
| - |
152 |
| - |
153 |
| -## Performance |
154 |
| - |
155 |
| -Packing and extracting a 6.1 GB with 2496 directories and 2398 files yields the following results on my Macbook Air. |
156 |
| -[See the benchmark here](https://gist.github.com/mafintosh/8102201) |
157 |
| - |
158 |
| -* tar-fs: 34.261 ms |
159 |
| -* [node-tar](https://github.com/isaacs/node-tar): 366.123 ms (or 10x slower) |
160 |
| - |
161 |
| -## License |
162 |
| - |
163 |
| -MIT |
| 15 | +<details> |
| 16 | +<summary>Fork this repo</summary> |
| 17 | +<p> |
| 18 | + |
| 19 | +Begin by [forking this repo](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/fork-a-repo). |
| 20 | +</p> |
| 21 | +</details> |
| 22 | + |
| 23 | +<details> |
| 24 | +<summary>Enable Code Scanning</summary> |
| 25 | +<p> |
| 26 | + |
| 27 | +#### Security tab |
| 28 | + |
| 29 | +Click on the `Security` tab. |
| 30 | + |
| 31 | + |
| 32 | +<img src="https://user-images.githubusercontent.com/6920330/96745784-81480380-1394-11eb-886d-55e7c207c9c9.png" width="70%"/> |
| 33 | + |
| 34 | +#### Set up code scanning |
| 35 | + |
| 36 | +Click `Set up code scanning`. |
| 37 | + |
| 38 | +<img src="https://user-images.githubusercontent.com/6920330/96745792-8311c700-1394-11eb-83fd-e47d09bf148e.png" width="70%"/> |
| 39 | + |
| 40 | +#### Setup Workflow |
| 41 | + |
| 42 | +Click the `Setup this workflow` button by CodeQL Analysis. |
| 43 | + |
| 44 | +<img src="https://user-images.githubusercontent.com/6920330/96746928-aee17c80-1395-11eb-9eb2-657dd0e92ed9.png" width="70%"/> |
| 45 | + |
| 46 | +This will create a GitHub Actions Workflow file with CodeQL already set up. Since Javascript is an interpreted language there is no need to configure any builds. See the [documentation](https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/running-codeql-code-scanning-in-your-ci-system) if you would like to configure CodeQL Analysis with a 3rd party CI system instead of using GitHub Actions. |
| 47 | +</p> |
| 48 | +</details> |
| 49 | + |
| 50 | +<details> |
| 51 | + |
| 52 | +<summary>Actions Workflow file</summary> |
| 53 | +<p> |
| 54 | + |
| 55 | +#### Actions Workflow |
| 56 | + |
| 57 | +The Actions Workflow file contains a number of different sections including: |
| 58 | +1. Checking out the repository |
| 59 | +2. Initializing the CodeQL Action |
| 60 | +3. Running Autobuilder (not necessary for interpreted languages) |
| 61 | +4. Running the CodeQL Analysis |
| 62 | + |
| 63 | +<img src="https://user-images.githubusercontent.com/6920330/96746940-b143d680-1395-11eb-9778-0891525a39c1.png" width="80%"/> |
| 64 | + |
| 65 | +Click `Start Commit` -> `Commit this file` to commit the changes. |
| 66 | +</p> |
| 67 | +</details> |
| 68 | + |
| 69 | +<details> |
| 70 | +<summary>GitHub Actions Progress</summary> |
| 71 | + |
| 72 | +<p> |
| 73 | + |
| 74 | +#### GitHub Actions Progress |
| 75 | + |
| 76 | +Click `Actions` tab -> `CodeQL` |
| 77 | + |
| 78 | +Click the specific workflow run. You can view the progress of the Workflow run until the analysis completes. |
| 79 | + |
| 80 | +<img src="https://user-images.githubusercontent.com/6920330/96748337-64f99600-1397-11eb-9ab7-b78ec23466ae.png" width="80%"/> |
| 81 | + |
| 82 | +</p> |
| 83 | +</details> |
| 84 | + |
| 85 | +<details> |
| 86 | +<summary>Security Issues</summary> |
| 87 | +<p> |
| 88 | + |
| 89 | +Once the Workflow has completed, click the `Security` tab -> ` Code Scanning Alerts`. An security alert "Arbitrary file write during zip extraction ("Zip Slip") |
| 90 | +" should be visible. |
| 91 | + |
| 92 | +#### Security Alert View |
| 93 | + |
| 94 | +Clicking on the security alert will provide details about the security alert including: |
| 95 | +A description of the issue |
| 96 | +A tag to the CWE that it is connected to as well as the type of alert (Error, Warning, Note) |
| 97 | +The line of code that triggered the security alert |
| 98 | +The ability to dismiss the alert depending on certain conditions (false positive? won't fix? used in tests?) |
| 99 | + |
| 100 | +<img src="https://user-images.githubusercontent.com/6920330/96749627-0c2afd00-1399-11eb-92f9-3356e387201f.png" width="80%"/> |
| 101 | + |
| 102 | +#### Security Alert Description |
| 103 | + |
| 104 | +Click `Show more` to view a full desciption of the alert including examples and links to additional information. |
| 105 | + |
| 106 | +<img src="https://user-images.githubusercontent.com/6920330/96749626-0c2afd00-1399-11eb-9ef5-9560ca585a1b.png" width="80%"/> |
| 107 | + |
| 108 | +#### Security Full Description |
| 109 | + |
| 110 | +<img width="80%" src="https://user-images.githubusercontent.com/6920330/97208478-8bea0a80-1791-11eb-8a2a-f625649312f0.png"> |
| 111 | + |
| 112 | +</p> |
| 113 | +</details> |
| 114 | + |
| 115 | +<details> |
| 116 | +<summary>Show Paths</summary> |
| 117 | +<p> |
| 118 | + |
| 119 | +#### Show Paths Button |
| 120 | + |
| 121 | +CodeQL Analysis is able to trace the dataflow path from source to sink and gives you the ability to view the path traversal within the alert. |
| 122 | + |
| 123 | +Click `show paths` in order to see the dataflow path that resulted in this alert. |
| 124 | + |
| 125 | +<img src="https://user-images.githubusercontent.com/6920330/96749839-514f2f00-1399-11eb-80f7-1b83e5c195e7.png" width="80%"/> |
| 126 | + |
| 127 | +#### Show Paths View |
| 128 | + |
| 129 | +<img src="https://user-images.githubusercontent.com/6920330/96749909-6926b300-1399-11eb-99df-143d17804aeb.png" width="80%"/> |
| 130 | + |
| 131 | +</p> |
| 132 | +</details> |
| 133 | + |
| 134 | +<details> |
| 135 | +<p> |
| 136 | + |
| 137 | +<summary>Fix the Security Alert</summary> |
| 138 | + |
| 139 | +In order to fix this specific alert, we will need to ensure that the destination file paths is the only location where files can be written to. |
| 140 | + |
| 141 | +Click on the `Code` tab and [Edit](https://docs.github.com/en/free-pro-team@latest/github/managing-files-in-a-repository/editing-files-in-your-repository) the `index.js` file. Navigate to Line 264 of the `index.js` file and modify the line: |
| 142 | + |
| 143 | +`var srcpath = path.resolve(cwd, header.linkname)` |
| 144 | + |
| 145 | +to |
| 146 | + |
| 147 | +`var srcpath = path.join(cwd, path.join('/', header.linkname))` |
| 148 | + |
| 149 | +Click `Create a new branch for this commit and start a pull request`, name the branch `fix-zip-slip`, and create the Pull Request. |
| 150 | + |
| 151 | +#### Pull Request Status Check |
| 152 | + |
| 153 | +In the Pull Request, you will notice that the CodeQL Analysis has started as a status check. Wait until it completes. |
| 154 | + |
| 155 | +<img src="https://user-images.githubusercontent.com/6920330/96752215-2adec300-139c-11eb-9c5e-3a04f24ba0bf.png" width="80%"/> |
| 156 | + |
| 157 | +#### Security Alert Details |
| 158 | + |
| 159 | +After the Workflow has completed click on `Details` by the `Code Scanning Results / CodeQL` status check. |
| 160 | + |
| 161 | +<img src="https://user-images.githubusercontent.com/6920330/96752487-85781f00-139c-11eb-943d-602f2de98998.png" width="80%"/> |
| 162 | + |
| 163 | +#### Fixed Alert |
| 164 | + |
| 165 | +Notice that Code Scanning has detected that this Pull Request will fix the Zip Slip vulnerability that was detected before. |
| 166 | + |
| 167 | +<img src="https://user-images.githubusercontent.com/6920330/96752486-85781f00-139c-11eb-9a7e-3ccbc81da3d1.png" width="80%"/> |
| 168 | + |
| 169 | +Merge the Pull Request. After the Pull Request has been merged, another Workflow will kick off to scan the repository for any vulnerabilties. |
| 170 | + |
| 171 | +#### Closed Security Alerts |
| 172 | + |
| 173 | +After the final Workflow has completed, navigate back to the `Security` tab and click `Closed`. Notice that the Zip Slip security alert now shows up as a closed issue. |
| 174 | + |
| 175 | +<img src="https://user-images.githubusercontent.com/6920330/96753441-e0f6dc80-139d-11eb-9a2a-d53075b6331e.png" width="80%"/> |
| 176 | + |
| 177 | +#### Traceability |
| 178 | + |
| 179 | +Click on the security alert and notice that it details when the fix was made, by whom, and the specific commit. This provides full traceability to detail when and how a security alert was fixed and exactly what was changed to remediate the issue. |
| 180 | + |
| 181 | +<img src="https://user-images.githubusercontent.com/6920330/96753440-e05e4600-139d-11eb-81ed-c22e4f41d74a.png" width="80%"/> |
| 182 | + |
| 183 | +</p> |
| 184 | +</details> |
| 185 | + |
| 186 | +## Next Steps |
| 187 | + |
| 188 | +Ready to talk about advanced security features for GitHub Enterprise? [Contact Sales](https://enterprise.github.com/contact) for more information! |
| 189 | + |
| 190 | +Check out [GitHub's Security feature page](https://github.com/features/security) for more security features embedded into GitHub. |
| 191 | + |
| 192 | +Check out the Code Scanning [documentation](https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/about-code-scanning) for additional configuration options and technical details. |
0 commit comments