Summary
The external storage feature allows any user to enumerate the name and content of files on the server
Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
Create a new storage backend
![image](https://private-user-images.githubusercontent.com/4344935/389855985-84c0d789-e718-4698-a851-f2e692b04a13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1NTk4NS04NGMwZDc4OS1lNzE4LTQ2OTgtYTg1MS1mMmU2OTJiMDRhMTMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MzRjODhmNzM5ZTY0MzhlNmU5ZmM2Y2VmODc2YmMyNzAzOTgxZTZiYjQ5ZmI3OTRlYWZlMDhkMWUzMDliMGVkZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.lRwVT9ljR9F3ZeR2oag4jtkH3NUm13JY1SJt42s1sWQ)
Use it with an arbitray path, e.g. /opt/recipes/mediafiles/files
![image](https://private-user-images.githubusercontent.com/4344935/389856201-2664a615-83bd-4fff-82b4-df7be07e0a62.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1NjIwMS0yNjY0YTYxNS04M2JkLTRmZmYtODJiNC1kZjdiZTA3ZTBhNjIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YzVhOWYyYjNiOTNmNTM3NGEwYTc3NWJjYjQwN2U1OTkyZWI3ZWIwNjAwM2YzN2FkN2EzOWQ3MzI0YTFlYTNkNiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.ojRdXM00C8k3xsYnctIzFDoBydben9sri5Nu6Mz97L0)
Click "Sync Now" and tandoor shows all filenames in the specified directory
![image](https://private-user-images.githubusercontent.com/4344935/389856454-e0f112cf-f9c1-4c26-ae31-da8e1b34a617.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1NjQ1NC1lMGYxMTJjZi1mOWMxLTRjMjYtYWUzMS1kYThlMWIzNGE2MTcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWZkYTdkNzBjNGQxZjIxODlhYjllYjkzY2IwMTUzM2NiZGE4MzlmNjQ2NTdlZGVlNWM1YWM5ZGY5NWEwOGNhNyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.vsLTCRbsv6LfDUTiKNx-pjDIbR1YvzKK2WhwdJwbQS4)
This way it's e.g. possible to enumerate all uploaded files, even those from other users/spaces
The files in the mediafiles/files directory can then be viewed/downloaded
![image](https://private-user-images.githubusercontent.com/4344935/389856763-31ea60d1-9bb5-438d-afc3-a83cc7831262.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1Njc2My0zMWVhNjBkMS05YmI1LTQzOGQtYWZjMy1hODNjYzc4MzEyNjIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWUwODgwYjExZmUwN2I2NDQ2YWY4NGQ0OGJiY2YwY2VjMjQwNzVkODQ3YzY4ZDg1OWI5YzI4NDk1YmJiZDUzMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.9XuPJZw1SNqO2n3vz8U19w_lKO0iT_Kn5Z69OF8Fpco)
Further, we can import and view PDFs from ANY directiory
![image](https://private-user-images.githubusercontent.com/4344935/389859592-2f91ffa3-7e5e-4f40-b8a1-3a70abb2329b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1OTU5Mi0yZjkxZmZhMy03ZTVlLTRmNDAtYjhhMS0zYTcwYWJiMjMyOWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGM0NTM3NjcxMjE2ZjUxYTAxZjE4ZTRiMDVhZjJkY2U1NjdhMDc2Y2IxNTk3MTJiMDcwYTE2NjFkMDIzNGJjYyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.nnZ8tlkHY8DTC5Y6zmdrznFA2HDRXOkr_VHgC5BMmG0)
![image](https://private-user-images.githubusercontent.com/4344935/389860835-7ab081ae-4a08-401b-984f-bd0d868f2aa6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg2MDgzNS03YWIwODFhZS00YTA4LTQwMWItOTg0Zi1iZDBkODY4ZjJhYTYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjkyYTU1MDkwZjUxMWZjZGMwNzdjMTA5Y2ExZjlhMWFmZDlmN2FkYWZhNTIzNjQxY2YwODg1ZjFjMGQyMDI3ZSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.IWiH8_d_t4Vd2mBXFFmfGzE7ex6KDskQ4PDEX4vzf4U)
But it is also possible to enumerate files in other directories such as /etc
![image](https://private-user-images.githubusercontent.com/4344935/389856912-ad2fb1da-d8ae-4f11-810a-d21d80b67d51.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1NjkxMi1hZDJmYjFkYS1kOGFlLTRmMTEtODEwYS1kMjFkODBiNjdkNTEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Y2Q5NzBiZDk1OTA1MDg5MWNhM2ViZTBmODYwMWQzZmRhZmRmNTNlZjFhNDIxZjczYjg5NmQ4NzM5NGE0NGVhOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.AlOtiVMS4GIn74OSk14QrwmfxyR0sSfFwx6zVmT2p3c)
While the tandoor doesn't show their content in the frontend, because they are not PDF files, nor are in the mediafiles directory, we can use the API endpoint /api/get_recipe_file/[ID]
in order to get the content.
E.g. here is the content of the /etc/passwd file
![image](https://private-user-images.githubusercontent.com/4344935/389861454-e313a2df-ee1e-45b5-9a19-119ba31c923a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg2MTQ1NC1lMzEzYTJkZi1lZTFlLTQ1YjUtOWExOS0xMTliYTMxYzkyM2EucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDE3ZmNkNDgxZTQxZWMyYWNmNzkzMjczMDI0MDBmNmU1MzgxMjA3NWEzNjFiMmY1MDgzOWZmY2E4YzdlYzE5YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.cegoDBicZ_o3foN2qNVlipflnicvMduWarW_23U_SDA)
or the content of the /root/.ash_history file
![image](https://private-user-images.githubusercontent.com/4344935/389862163-332d0296-92d1-46f4-bdf0-bab753e49f7a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg2MjE2My0zMzJkMDI5Ni05MmQxLTQ2ZjQtYmRmMC1iYWI3NTNlNDlmN2EucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjVhMzIxMjUzYjY5MzhhMjU5NWZlZjUxYzRjOTJhYjQ3YWNiMWVhMTUwM2QxODIxYzRkMWVmMDNmZTBkYTM0ZSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.EO9FLV-rEse65BYQa3NWyKlW2VFfteJfYTWAv6lDask)
Impact
We can view the content of any file on the server
Summary
The external storage feature allows any user to enumerate the name and content of files on the server
Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
Create a new storage backend
![image](https://private-user-images.githubusercontent.com/4344935/389855985-84c0d789-e718-4698-a851-f2e692b04a13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1NTk4NS04NGMwZDc4OS1lNzE4LTQ2OTgtYTg1MS1mMmU2OTJiMDRhMTMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MzRjODhmNzM5ZTY0MzhlNmU5ZmM2Y2VmODc2YmMyNzAzOTgxZTZiYjQ5ZmI3OTRlYWZlMDhkMWUzMDliMGVkZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.lRwVT9ljR9F3ZeR2oag4jtkH3NUm13JY1SJt42s1sWQ)
Use it with an arbitray path, e.g.
/opt/recipes/mediafiles/files
Click "Sync Now" and tandoor shows all filenames in the specified directory
This way it's e.g. possible to enumerate all uploaded files, even those from other users/spaces
The files in the mediafiles/files directory can then be viewed/downloaded
Further, we can import and view PDFs from ANY directiory
![image](https://private-user-images.githubusercontent.com/4344935/389859592-2f91ffa3-7e5e-4f40-b8a1-3a70abb2329b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg1OTU5Mi0yZjkxZmZhMy03ZTVlLTRmNDAtYjhhMS0zYTcwYWJiMjMyOWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGM0NTM3NjcxMjE2ZjUxYTAxZjE4ZTRiMDVhZjJkY2U1NjdhMDc2Y2IxNTk3MTJiMDcwYTE2NjFkMDIzNGJjYyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.nnZ8tlkHY8DTC5Y6zmdrznFA2HDRXOkr_VHgC5BMmG0)
But it is also possible to enumerate files in other directories such as
/etc
While the tandoor doesn't show their content in the frontend, because they are not PDF files, nor are in the mediafiles directory, we can use the API endpoint
/api/get_recipe_file/[ID]
in order to get the content.E.g. here is the content of the /etc/passwd file
![image](https://private-user-images.githubusercontent.com/4344935/389861454-e313a2df-ee1e-45b5-9a19-119ba31c923a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNzg4MjgsIm5iZiI6MTczOTM3ODUyOCwicGF0aCI6Ii80MzQ0OTM1LzM4OTg2MTQ1NC1lMzEzYTJkZi1lZTFlLTQ1YjUtOWExOS0xMTliYTMxYzkyM2EucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTJUMTY0MjA4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDE3ZmNkNDgxZTQxZWMyYWNmNzkzMjczMDI0MDBmNmU1MzgxMjA3NWEzNjFiMmY1MDgzOWZmY2E4YzdlYzE5YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.cegoDBicZ_o3foN2qNVlipflnicvMduWarW_23U_SDA)
or the content of the /root/.ash_history file
Impact
We can view the content of any file on the server